2010-08-31 2 views
0

Dire que je l'ai mis en place une structure d'URL comme suit (ASP.NET MVC2)Comment ce contrôleur peut-il obtenir les valeurs dont il a besoin?

http://localhost:XXXX/Product/

Cliquez sur Parcourir lien par couleur

http://localhost:XXXX/Product/Color/

Cliquez sur le lien parcourir les articles de couleur rouge par le type (sa plume)

http://localhost:XXXX/Product/Color/Red/Pen

Dans le contrôleur, je vais devoir faire une sélection basée sur ces critères. Sauf quand auparavant, je pouvais aller

public ActionResult ShowTypesForColor(string color)

mais pour faire celui-ci:

public ActionResult ShowItems(string type)

Je dois aussi la couleur qui a été sélectionné.

Comment est-ce que je pourrais faire ceci? Est-ce que diviser la chaîne d'URL est le seul moyen?

modifier: peut-être que j'ai obtenu d'avance sur moi dans le global.asax.cs

routes.MapRoute(null, "Product/Color/", new { controller = "Product", action = "ShowAllColors" }); 

routes.MapRoute(null, "Product/Color/{color}", new { controller = "Product", action = "ShowTypesForColor" }); 

routes.MapRoute(null, "Product/Color/{color}/{type}", new { controller = "Product", action = "ShowDetail" }); 

Je ne pense pas que je peux définir la dernière comme ça je peux? avec deux {} valeurs?

Répondre

1

Votre dernier itinéraire semble parfaitement valide. Il tracera à l'action avec la signature comme ceci:

ActionResult ShowDetails(string color, string type) { 
    return View(/*view params*/); 
} 

EDIT Je pense que l'ordre est faux, donc si la dernière route n'est pas tiré, essayez de faire ceci:

routes.MapRoute(null, "Product/Color/{color}/{type}", new { controller = "Product", action = "ShowDetail" }); 

routes.MapRoute(null, "Product/Color/{color}", new { controller = "Product", action = "ShowTypesForColor" }); 

routes.MapRoute(null, "Product/Color/", new { controller = "Product", action = "ShowAllColors" }); 

L'ordre des routes MVC devrait être de la plus spécifique au moins spécifique, sinon la route la moins spécifique (/product/color/{color}) correspond à l'URL product/color/red/pen avant la /product/color/{color}/{type}

+0

ah la commande. ça a fait l'affaire. Bravo – baron

1

plus spécifique Vous peut mettre plusieurs jetons dans votre itinéraire (par exemple, {couleur} et {type}) mais cela ne fonctionne pas comme vous l'avez fait ici. Pourquoi avez-vous défini "Couleur" comme deuxième segment de votre URL? Pourquoi ne pas simplement faire/Produits/Rouge et/Produits/Rouge/Stylo? Il est incohérent de faire .../Colors/Red et pas .../Types/Pen donc je laisserais simplement les qualificatifs "Couleurs" et "Types" complètement.

Je définir votre ShowItems() méthode comme ceci: méthode

public ActionResult ShowItems(string color, string type) 

cela vous permettra d'avoir une route comme/Produits/Rouge/Pen où vos cartes de route vers ce ShowItems(). Mais vous aurez toujours besoin de différencier cela de la méthode ShowTypesForColor() où aussi prend un premier paramètre de couleur. Le framework de routage va juste traiter le type comme nul - pour la route qui a les deux jetons, assurez-vous que vous avez une contrainte d'itinéraire spécifiant que ni la couleur ni le type peuvent être null/vide (c.-à-d., pour la route ShowItems()).

+0

vous avez probablement raison. Je vais devoir y réfléchir un peu plus. Merci – baron

Questions connexes