Rutas personalizadas ASP.NET MVC con argumentos opcionales
-
05-07-2019 - |
Pregunta
Quiero una ruta con dos args opcionales; Pensé que lo siguiente funcionaría:
routes.MapRoute(
"ProductForm",
"products/{action}/{vendor_id}_{category_id}",
new { controller = "Products", action = "Index", vendor_id = "", category_id = "" },
new { action = @"Create|Edit" }
);
Pero solo funciona cuando se proporcionan tanto vendor_id
como category_id
; usando RouteDebug
veo que / products / create / _3
no activa mi ruta, así que agregué otras dos rutas:
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" }
);
Entonces, las preguntas:
-
¿Utilizar tres rutas es la única forma de hacer una ruta con argumentos opcionales?
-
¿Estas URL son correctas o no, es decir, sugerirías una mejor manera de hacer esto?
Solución
¿Por qué no intentas darle a vendor_id un valor predeterminado (si no se especifica, es decir, 0) que te ayudaría a escapar con una ruta?
routes.MapRoute("ProductForm","products/{action}/{vendor_id}_{category_id}",
new { controller = "Products", action = "Index", vendor_id = "0", category_id = "" },
new { action = @"Create|Edit" });
Otros consejos
me parece bien, pero lo haría un poco diferente:
routes.MapRoute(
"ProductForm1",
"product/category/{category_id}",
new { controller = "Home", action = "Index", category_id = "" },
new { controller = "Products", action = @"Create|Edit" }
);
y luego
routes.MapRoute(
"ProductForm1",
"product/details/{product_id}",
new { controller = "Home", action = "Index", product_id = "" },
new { controller = "Products", action = @"Create|Edit" }
);
entonces su clase puede ser la siguiente:
ActionResults Index(){}
ActionResults Index(int category_id){// get categories}
ActionResults Index(int product_id){ // get products}
pero eso es solo yo
puedes intentarlo así:
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" });
Entonces crearía algo de lógica en su método de resultado de acción para verificar arg1 y arg2 e identificar qué argumento se ha pasado.
sus URL de actionlink se verían así:
/products/create/vendor/10
/products/create/category/20
/products/create/vendor/10/category/20
/products/create/category/20/vendor/10
Personalmente no me gusta esto, ya que la ruta no parece muy limpia, pero ¿debería darte lo que creo que quieres lograr?