2010-06-07 2 views
0

Le routage dont j'ai besoin est assez simple, il me manque quelque chose. Comme exemple de code, je mets la situation la plus simple où je peux reproduire mon comportement.routage d'url entrant/sortant dans asp.net MVC

Vous avez cette ActionMethod:

public ActionResult Index(string provider) 
{ 
    ViewData["Message"] = provider; 
    return View("Index"); 
} 

Et vous avez cette voie:

routes.MapRoute(
     null, 
     "{controller}/{action}/{provider}", 
     new { controller = "Home", action = "Index", provider = "Default" } 
); // Parameter defaults 

Vous pouvez appeler /Accueil/Index/personnalisée et fournisseur prendra la valeur "personnalisée"

De quel chemin aurais-je besoin si je veux l'url /? Provider = Custom pour mapper le fournisseur à t Le paramètre. Je pensais que cela fonctionnerait simplement, car le contrôleur par défaut et l'action par défaut seraient utilisés, et le fournisseur de la chaîne de requête serait utilisé à la place de celui par défaut. mais la chaîne de requête est juste ignorée ici.

C'est un problème dans ma situation car j'ai un formulaire utilisant la méthode HTTP GET. L'action de formulaire doit être Html.BeginForm (c => c.Index (null)) qui est résolu en tant que / et la valeur de mon formulaire est ajoutée dans la chaîne de requête. (Le fournisseur étant un menu déroulant sous la forme)

Ainsi, l'url construit par la forme est /? Abc = valeur & cde = valeur ...

MISE À JOUR

La réponse acceptée ci-dessous (voir les commentaires) m'a conduit à cette solution:

routes.MapRoute(
    "Search", 
    "search/", 
    new { controller = "Home", action = "Index" } 
); 

routes.MapRoute(
    null, 
    "{controller}/{action}/{provider}", 
    new { controller = "Home", action = "Index", provider = "Default"} 
); 

Et déclarer la forme comme ceci:

Html.BeginRouteForm("Search", FormMethod.Get){ 
... 
} 

De cette façon, le formulaire fonctionnera avec le fournisseur dans QueryString (lorsque j'utilise la recherche d'itinéraire nommé) mais dans tous les autres cas, j'utiliserai l'itinéraire par défaut. :)

Répondre

2

Lorsque je définis le fournisseur sur urlparameter.optional au lieu d'une valeur statique, j'obtiens le comportement que vous recherchez. Je ne pense pas que je puisse expliquer complètement pourquoi cela fonctionne, alors que le fait d'avoir un ensemble de valeurs par défaut statique ne fonctionne pas, mais essayez-le et voyez si ça aide. Si cela fonctionne, vous pouvez également développer un itinéraire personnalisé pour votre formulaire afin que vous puissiez conserver votre fournisseur par défaut dans vos itinéraires, au lieu d'effectuer une vérification personnalisée dans vos contrôleurs.

routes.MapRoute(_ 
    "Default", _ 
    "{controller}/{action}/{provider}", _ 
    New With {.controller = "Home", .action = "Index", .provider = UrlParameter.Optional} _ 
) 

MISE À JOUR:

En outre, vous ne devez pas avoir les paramètres de votre itinéraire pour les passer à une méthode d'action du contrôleur.Par exemple, en utilisant l'itinéraire ci-dessus, je peux avoir cette URL

http://localhost:49705/home/about/default?otherValue=testme 

Et cette méthode de commande

Function About(ByVal provider As String, ByVal otherValue As String) As ActionResult 
    ViewData("Message") = provider & "|" & otherValue 
    Return View() 
End Function 

qui délivre la valeur par défaut de chaîne | testme

Cette URL fait la même chose que ci-dessus: http://localhost:49705/home/about/?provider=default&otherValue=testme

+0

Oui vous avez raison, cela fonctionne, sauf que j'ai vraiment besoin d'une valeur par défaut là ... Je ne veux pas coder le repli sur le fournisseur par défaut dans chaque action qui l'utilise. –

+0

Si le fournisseur est défini dans l'URL, pourquoi devrait-il faire partie de la collection de formulaires? Par exemple, si je vais sur site.com/home/about/customProvider et qu'un formulaire fait une action GET à partir d'ici, l'URL GET serait site.com/home/about/customProvider?form1=a&form2=b ... avez toujours votre fournisseur correct? – Tommy

+0

C'est une page de recherche, vous pouvez rechercher dans différents fournisseurs que vous définissez dans le formulaire. Mais j'ai aussi besoin de lier à partir d'une autre page, directement à la recherche avec le fournisseur correct. –

0

Peut-être que je ne comprends pas la question, mais si vous supprimez simplement le {provider} de votre itinéraire, ou utilisez la valeur par défaut {id} à la place. Ensuite, lorsque vous définissez l'URL sur /?provider=blah, "blah" est affecté au paramètre "provider".

+0

Oui, mais je ne reçois pas une valeur par défaut pour mon fournisseur ... Et je ne reçois pas l'URL sympa non plus quand j'ai un lien sur ma page. Ce serait bien si je n'avais pas un formulaire que ce soit utilisé pour obtenir cette page. mais j'ai besoin à la fois de routed (pour les liens) et QueryString (pour le formulaire) –