Question

Je veux une route avec deux arguments optionnels; Je pensais que cela fonctionnerait:

routes.MapRoute(
    "ProductForm",
    "products/{action}/{vendor_id}_{category_id}",
    new { controller = "Products", action = "Index", vendor_id = "", category_id = "" },
    new { action = @"Create|Edit" }
);

Mais cela ne fonctionne que lorsque vendor_id et category_id sont fournis; Utilisation de RouteDebug Je constate que / products / create / _3 ne déclenche pas mon itinéraire. J'ai donc ajouté deux autres itinéraires:

routes.MapRoute(
    "ProductForm1",
    "{controller}/{action}/_{category_id}",
    new { controller = "Home", action = "Index", category_id = "" },
    new { controller = "Products", action = @"Create|Edit" }
);

routes.MapRoute(
    "ProductForm2",
    "{controller}/{action}/{vendor_id}_",
    new { controller = "Home", action = "Index", vendor_id = "" },
    new { controller = "Products", action = @"Create|Edit" }
);

Alors, les questions:

  • L'utilisation de trois routes est-elle le seul moyen de créer une route avec des arguments facultatifs?

  • Ces URL sont-elles correctes ou non, suggéreriez-vous une meilleure façon de procéder?

Était-ce utile?

La solution

Pourquoi n'essayez-vous pas de donner à vendor_id une valeur par défaut (si elle n'est pas spécifiée, c'est-à-dire 0) qui vous aiderait à vous en sortir avec une seule route

routes.MapRoute("ProductForm","products/{action}/{vendor_id}_{category_id}",
new { controller = "Products", action = "Index", vendor_id = "0", category_id = "" },   
new { action = @"Create|Edit" });

Autres conseils

me convient bien mais je le ferais un peu différemment:

routes.MapRoute(
"ProductForm1",
"product/category/{category_id}",
new { controller = "Home", action = "Index", category_id = "" },
new { controller = "Products", action = @"Create|Edit" }

);

et ensuite

 routes.MapRoute(
"ProductForm1",
"product/details/{product_id}",
new { controller = "Home", action = "Index", product_id = "" },
new { controller = "Products", action = @"Create|Edit" }

);

alors votre classe peut être comme suit:

ActionResults Index(){}
ActionResults Index(int category_id){// get categories}
ActionResults Index(int product_id){ // get products}

mais c'est juste moi

vous pouvez l'essayer comme ceci:

routes.MapRoute(    
"ProductForm",
"products/{action}/{arg1}/{arg1_id}/{arg2}/{arg2_id}",    
new { controller = "Products", action = "Index", arg1 = "", arg2 = "", arg1_id = "", arg2_id = "" },
new { action = @"Create|Edit" });

Vous devez ensuite créer une logique dans votre méthode actionresult pour vérifier les arguments arg1 et arg2 et identifier l'argument transmis.

vos urls d'actionlink ressemblent à ceci:

/products/create/vendor/10
/products/create/category/20
/products/create/vendor/10/category/20
/products/create/category/20/vendor/10

Personnellement, je n'aime pas cela car l'itinéraire ne semble pas très propre, mais je devrais vous donner ce que je pense que vous cherchez à réaliser?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top