ASP.NET MVC eigene Routen mit optionaler args
-
05-07-2019 - |
Frage
Ich möchte eine Strecke mit zwei optionalen args; Ich dachte, die folgende funktionieren würde:
routes.MapRoute(
"ProductForm",
"products/{action}/{vendor_id}_{category_id}",
new { controller = "Products", action = "Index", vendor_id = "", category_id = "" },
new { action = @"Create|Edit" }
);
Aber es funktioniert nur, wenn beide vendor_id
und category_id
vorgesehen sind; mit RouteDebug
ich sehe, dass /products/create/_3
nicht meine Strecke auslöst, so dass ich hinzugefügt beiden anderen Routen:
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" }
);
Also, die Fragen:
-
Wird mit drei Routen der einzige Weg, um eine Route mit optionaler args?
machen
-
Sind diese URLs in Ordnung ist oder nicht, das heißt, würden Sie einen besseren Weg vorschlagen, dies zu tun?
Lösung
Warum versuchen Sie nicht einen Standardwert geben vendor_id (wenn es nicht heißt angegeben 0), die Sie mit einer Route wegkommen würde helfen,
routes.MapRoute("ProductForm","products/{action}/{vendor_id}_{category_id}",
new { controller = "Products", action = "Index", vendor_id = "0", category_id = "" },
new { action = @"Create|Edit" });
Andere Tipps
sieht mir gut, aber ich tun würde, es ein wenig anders aus:
routes.MapRoute(
"ProductForm1",
"product/category/{category_id}",
new { controller = "Home", action = "Index", category_id = "" },
new { controller = "Products", action = @"Create|Edit" }
);
und dann
routes.MapRoute(
"ProductForm1",
"product/details/{product_id}",
new { controller = "Home", action = "Index", product_id = "" },
new { controller = "Products", action = @"Create|Edit" }
);
dann Ihre Klasse kann wie folgt aussehen:
ActionResults Index(){}
ActionResults Index(int category_id){// get categories}
ActionResults Index(int product_id){ // get products}
, aber das ist nur mir
Sie es so versuchen könnten:
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" });
Dann würden Sie ein gewisse Logik in Ihrer Action Methode erstellen arg1 und arg2 zu überprüfen und weicht Argument identifizieren, in geben wurden.
Ihre Action Urls würde wie folgt aussehen:
/products/create/vendor/10
/products/create/category/20
/products/create/vendor/10/category/20
/products/create/category/20/vendor/10
persönlich nicht ich so wie die Strecke scheint nicht sehr sauber, aber sollten Sie geben, was ich denke, dass Ihr auf der Suche zu erreichen?