examples - Asp.net mvc routing: ¿cómo utilizar la acción predeterminada pero el parámetro no predeterminado?
net core api route (4)
Aquí es cómo se puede resolver esto:
Puede crear una restricción de ruta para indicar al motor de enrutamiento que si tiene algo en la url que parece un número (123), este es un parámetro de acción para la acción predeterminada y si tiene algo que no se parece a un número (AnotherAction) entonces es una acción.
Considere este código:
routes.MapRoute(
"MyController", "MyController/{productId}",
new {controller="My", action="Index"},
new {productId = @"/d+" });
Esta definición de ruta solo coincidirá con los valores numéricos después de MyController en http://mysite/MyController/123
por lo que no interferirá con llamar a otra acción en el mismo controlador.
Estoy reescribiendo la pregunta, ya que las respuestas hasta ahora me muestran que no la he definido lo suficientemente bien. Dejaré la pregunta original para referencia a continuación.
Cuando configura su enrutamiento, puede especificar valores predeterminados para diferentes partes url / route. Consideremos el ejemplo que genera el asistente VS:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "DefaultPage", action = "Index", id = UrlParameter.Optional } // Parameter defaults
En este ejemplo, si no se especifica el controlador, se utilizará DefaultPageController y si no se especifica la acción, se utilizará la acción "Índice". Las direcciones URL generalmente se verán como: http://mysite/MyController/MyAction
.
Si no hay ninguna acción en Url como esta: http://mysite/MyController
entonces se http://mysite/MyController
la acción de índice.
Ahora supongamos que tengo dos acciones en mi controlador Index y AnotherAction. Las direcciones URL que les corresponden son http://mysite/MyController
y http://mysite/MyController/AnotherAction
respectivamente. Mi acción "Índice" acepta un parámetro, id. Entonces, si necesito pasar un parámetro a mi acción de Índice, puedo hacer esto: http://mysite/MyController/Index/123
. Tenga en cuenta que, a diferencia de la URL http://mysite/MyController
, tengo que especificar explícitamente la acción del Índice. Lo que quiero hacer es poder pasar http://mysite/MyController/123
lugar de http://mysite/MyController/Index/123
. No necesito "Índice" en esta URL. Quiero que el motor mvc reconozca que cuando pido http://mysite/MyController/123
, 123 no es una acción (porque no he definido una acción con este nombre). ), pero un parámetro para mi acción por defecto "Índice". ¿Cómo configuro el enrutamiento para lograr esto?
A continuación se muestra la redacción original de la pregunta.
Tengo un controlador con dos métodos definidos como este
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(SomeFormData data)
{
return View();
}
Esto me permite procesar la URL como http://website/Page
cuando el usuario navega a esta url (GET) y cuando posteriormente vuelve a enviar el formulario (POST).
Ahora, cuando vuelvo a procesar la publicación, en algunos casos quiero redirigir el navegador a esta URL:
http://website/Page/123
Donde 123 es un número entero, y necesito un método para procesar esta URL en mi controlador.
¿Cómo configuro el enrutamiento, así que esto funciona? Actualmente tengo el enrutamiento "predeterminado" generado por el asistente como este:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "DefaultPage", action = "Index", id = UrlParameter.Optional } // Parameter defaults
Intenté agregar otro método de controlador como este:
public ActionResult Index(int id)
{
return View();
}
Pero esto no funciona ya que se lanza una excepción de acción ambigua:
La solicitud actual de acción ''Índice'' en el tipo de controlador ''PageController'' es ambigua entre los siguientes métodos de acción: System.Web.Mvc.ActionResult Index () en el tipo PageController System.Web.Mvc.ActionResult Index (Int32) en el tipo PageController
Debo agregar, que también tengo otras acciones en este controlador. This hubiera funcionado si no lo hubiera hecho.
Creo que quieres volver a la misma vista, pero necesitas entender que estás haciendo dos cosas diferentes. Uno es recibir publicación, y otro acceder por obtener, y otro acceder por obtener y parámetro ...
Debes hacer 3 acciones de resultados con nombres diferentes y devolver la misma vista que la Vista ("ThisIsTheResult")
Oh, ahora lo tengo. Creo que no es posible con la ruta predeterminada, necesitas mapear rutas personalizadas.
// /MyController/AnotherAction
routes.MapRoute(
null,
"MyController/AnotherAction",
new { controller = "DefaultPage", action = "AnotherAction" }
);
// /MyController
// /MyController/id
routes.MapRoute(
null,
"MyController/{id}",
new { controller = "DefaultPage", action = "Index", id = UrlParameter.Optional }
);
PD. Las rutas predeterminadas como / MyController / id deben mapearse por fin.
Si mantiene el nombre de la variable para seguir siendo ID, no necesita cambiar nada.
Cambie el nombre de la publicación a "PostIndex" y agregue este atributo:
[ActionName("Index")]
La misma pregunta en SO here .
Ok, aquí hay una respuesta para cortar / pegar, si eso ayuda.
public ActionResult Index() {
return View();
}
[AcceptVerbs(HttpVerbs.Post), ActionName("Index")]
public ActionResult PostIndex(SomeFormData data) {
return View();
}