2010-10-06 9 views
4

Je tente de créer des routes pour une ressource avec un tableau de paramètres homogènes.Route MVC avec tableau de paramètres homogènes

URL ressemblerait à ceci: produits/catégorie/{categoryId1}/{} categoryId2 /.../ marque/{brandID1}/{brandID2}/...

et je voudrais une méthode d'action ressemblerait à ceci: public ActionResult GetProducts (IList categoryID, ILIsts brandID) {...}

où la catégorie et la marque sont des filtres indépendants.

J'ai trouvé une solution pour similaire tâche: ASP.NET MVC 2 Parameter Array

et je me demande s'il n'y a pas plus belle solution qui permet d'utiliser ce prototype GetProducts de ActionResult publics (IList CategoryId)

au lieu de public ActionResult MonAction (string url)

pour la méthode d'action

- pour éviter de fendre la chaîne et casting?

Et comment pourrais-je adapter cette solution à mon cas?

Merci tout le monde avant!

Répondre

7

Utilisez un gestionnaire personnalisé, comme celui que j'ai publié dans this answer.

pourrions avoir besoin des ajustements, mais quelque chose comme cela devrait fonctionner:

public class ProductsRouteHandler : IRouteHandler 
{ 
    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     IRouteHandler handler = new MvcRouteHandler(); 
     var vals = requestContext.RouteData.Values; 
     vals["categoryID"] = vals["categories"].Split("/"); 
     vals["brandID"] = vals["brands"].Split("/"); 
     return handler.GetHttpHandler(requestContext); 
    } 
} 

// in the route: 
routes.MapRoute(
    "test", 
    "products/category/{*categories}/brand/{*brands}", 
    new { Controller = "product", Action = "getproducts"} 
    ).RouteHandler = new ProductsRouteHandler(); 
+0

Merci pour une belle solution! Je ne pouvais simplement pas enregistrer une telle route: "products/category/{* categories}/brand/{* brands}". Une erreur d'exécution se produit: Un paramètre catch-all ne peut apparaître que comme le dernier segment de l'URL de route – Polina

+0

do "products/category/{* parameters}", et obtenir les 2 morceaux avec .Split ("/ brand /") .. – eglasius

+0

... en fonction de vos besoins, vous pouvez également ajouter une contrainte sur les paramètres afin qu'il n'utilise que la route si/marque/est là – eglasius