enrutamiento asp mvc con dos parámetros opcionales

Hola. ¿Cómo puedo asignar la url ../Companies/Results/value/id cuando ambos parámetros son opcionales?

Las empresas es el controlador, los resultados es la acción, el valor y la identificación son parámetros opcionales. En mi formulario hay un cuadro de texto para el valor y una lista de selección para un id. El usuario puede seleccionar ambos o uno de cada uno para buscar. Probé algo así, pero no puedo manejarlo cuando falta uno de los parámetros opcionales, por ejemplo, valor, como ../Companies/Results/ / id

routes.MapRoute( "Company+Profession", // Route name "{action}/{value}/{profId}", // URL with parameters new { controller = "Companies", action = "Index", value = UrlParameter.Optional, profId = UrlParameter.Optional } // Parameter defaults ); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults ); 

No puede tener una ruta que tenga dos parámetros opcionales, solo el último parámetro puede ser opcional precisamente por el problema que describe. Sugiero que tenga un parámetro predeterminado para el value , como byid, y use esto cuando la persona seleccione una profesión.

Supongo que está construyendo la URL a través de javascript, ya que el uso de una acción de formulario GET daría como resultado que los nombres de los parámetros se agreguen a la URL. En este caso, cuando el cuadro de texto está vacío, simplemente inserte el byid predeterminado.

Actualice su ruta para incluir la predeterminada, por lo que cualquier URL que genere funcionará. Consulte la publicación de blog de Phil Haack sobre esto para una forma alternativa de manejar las URL generadoras que tienen dos parámetros “opcionales”.

 // used when both parameters are specified routes.MapRoute( "Company+Profession", // Route name "{action}/{value}/{profId}", // URL with parameters new { controller = "Companies", action = "Index", value ="byid", profId = UrlParameter.Optional } // Parameter defaults ); 

Gracias chicos, acabo de descubrir las restricciones de ruta para el número entero. Y así, juguetear con algunas combinaciones de rutas parece funcionar de la manera que quiero:

  routes.MapRoute( "Detail", // Route name "{action}/{value}", // URL with parameters new { controller = "Companies", action = "Detail" }, // Parameter defaults new { value = @"\d+" } //integer only ); routes.MapRoute( "Company + Profession", // Route name "{action}/{value}/{profId}", // URL with parameters new { controller = "Companies", action = "Results" }, // Parameter defaults new { profId = @"\d+" } //integer only ); routes.MapRoute( "Profession", // Route name "{action}/{profId}", // URL with parameters new { controller = "Companies", action = "Results"}, // Parameter defaults new {profId = @"\d+" } //integer only ); routes.MapRoute( "Company", // Route name "{action}/{value}", // URL with parameters new { controller = "Companies", action = "Results" } // Parameter defaults ); routes.MapRoute( "RootFolder", // Route name "{action}/{value}", // URL with parameters new { controller = "Companies", action = "Index", value = UrlParameter.Optional } // Parameter defaults ); 

No estoy seguro, ya que ahora no tengo dónde probar esto, pero esta es mi sugerencia

 routes.MapRoute( "Company+Profession", // Route name "Companies/{action}/value-{value}/id-{profId}", // URL with parameters new { controller = "Companies", action = "Index", value = UrlParameter.Optional, profId = UrlParameter.Optional } // Parameter defaults );