2010-01-27 4 views
2

J'ai un projet ASP.Net MVC très basique dans lequel j'aimerais utiliser un nom de paramètre id sur l'une de mes actions de contrôleur. De tout ce que j'ai lu cela ne devrait pas poser de problème mais pour une raison quelconque, l'utilisation d'un nom de paramètre id ne parvient pas à extraire la valeur de la chaîne de requête, mais si je la change pour un autre nom, cela fonctionnera.Le paramètre id de QueryString n'est pas utilisé

ne me reste qu'une seule voie dans mon global.asx

routes.MapRoute(
    "Default",            // Route name 
    "{controller}/{action}/{id}",       // URL with parameters 
    new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
); 

Ma méthode de commande est:

public ActionResult Confirm(string id) 
{ 
    .... 
} 

URL de http://mysite/customer/confirm/abcd œuvres. Une URL de http://mysite/customer/confirm?id=abcd échoue.

Si je change la méthode de commande à:

public ActionResult Confirm(string customerID) 
{ 
    .... 
} 

alors une URL de http://mysite/customer/confirm?customerID=abcd œuvres.

Y a-t-il quelque chose de spécial à propos de l'utilisation de "id" comme paramètre dans une chaîne de requête ASP.Net MVC?

Mise à jour: Changé id de 1234 à abcd, mes identifiants sont en fait des chaînes.

+0

Je suppose que la valeur par défaut "" pour la valeur de route "id" est utilisée * avant * l'identifiant que vous fournissez dans la chaîne de requête , puisque "confirm? id =" ne correspond qu'aux deux premières valeurs de route (contrôleur et action). La question est; Pourquoi voulez-vous des URL comme "confirm? id ="? Il est lié à causer de la confusion; pas seulement pour le module de routage d'URL. :) – bzlm

+0

J'espérais pouvoir garder le format d'URL que j'avais avant MVC qui utilisait id dans la chaîne de requête. – sipwiz

+0

@sipwiz cette approche peut causer des problèmes subtils. Si vous utilisez MVC pour générer des liens, ce ne sera pas un problème - des choses comme 'HtmlHelper.ActionLink' sont routinières, ce qui signifie un lien vers la méthode d'action' Confirm' avec id = 1 car une valeur de route serait rendue comme '/ Confirm/1', pas comme' Confirm? Id = 1'. Avez-vous besoin de prendre en charge les liens entrants hérités, même pour les confirmations? Ensuite, voir ici: http://stackoverflow.com/questions/817325/asp-net-mvc-routing-legacy-urls-passing-querystring-ids-to-controller-actions – bzlm

Répondre

1

Si vous ne demandez pas un paramètre id (soit querystring ou POST), le système, il ne tient pas compte juste, et vous pouvez supprimer le paramètre « id » dans votre contrôleur:

public ActionResult Confirm() 

Dans votre cas, vous voudrais simplement coller avec le paramètre id. Pourquoi créer un paramètre customerID moche, quand id est "mappé" automatiquement?

Ceci est un exemple simple et facile de l'utilisation du paramètre id.

public ActionResult Confirm(int? id) 
{ 
    if (id.HasValue && id.Value > 0) // check the id is actually a valid int 
     _customerServer.GetById(id.Value); 

    // do something with the customer 

    return View(); 
} 

Cela fonctionne aussi, pour moi. Nous le faisons dans notre application maintenant avec une route standard:

public ActionResult Confirm(string id) 
{ 
    if (!string.IsNullOrEmpty(id)) // check the id is actually a valid string 
     _customerServer.GetByStringId(id); 

    // do something with the customer 

    return View(); 
} 
+1

C'est effectivement ce que j'ai essayé avec Confirmer (id de chaîne). Le moteur MVC fonctionne avec id étant un int? mais pas une chaîne pour une raison quelconque. – sipwiz

+0

Mais vous avez spécifié un exemple de l'ID étant 1234 - c'est un int :-) Vous pouvez également le faire "int id". Alors ce n'est pas nul. Mais, quoi qu'il en soit, cela devrait toujours fonctionner avec le "id" étant une chaîne. J'ai mis à jour la réponse. – Kordonme

+0

Êtes-vous capable d'utiliser les deux formats d'URL: client/confirmer/abcd et client/confirmer? Id = abcd si oui, qu'avez-vous pour votre route dans global.asx? – sipwiz

1

Si vous avez besoin d'un identifiant dans la chaîne de requête, ne créez pas route avec le paramètre 'id'. Dans le cas où vous avez l'itinéraire "{controller}/{action}", vous pouvez utiliser public ActionResult Confirm(string id) comme méthode de contrôleur.

Les routes ne se soucient pas des chaînes de requête.

Questions connexes