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?

¿Fue útil?

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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top