asp.net mvc - página - Enrutamiento a las acciones con los mismos nombres pero diferentes parámetros.
no se ha llamado al método "renderbody" para la página de diseño (4)
Me encontré con una situación similar en la que quería que mi acción "Índice" manejara el renderizado si tenía una ID especificada o no. La solución que encontré fue hacer que el parámetro ID para el método de índice fuera opcional. Por ejemplo, originalmente intenté tener ambos:
public ViewResult Index()
{
//...
}
// AND
public ViewResult Index(int entryId)
{
//...
}
y los combiné y los cambié a:
public ViewResult Index(int entryId = 0)
{
//...
}
Tengo este conjunto de rutas:
routes.MapRoute(
"IssueType",
"issue/{type}",
new { controller = "Issue", action = "Index" }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
Aquí está la clase de controlador:
public class IssueController : Controller
{
public ActionResult Index()
{
// todo: redirect to concrete type
return View();
}
public ActionResult Index(string type)
{
return View();
}
}
por qué, cuando solicito http://host/issue i get The current request for action ''Index'' on controller type ''IssueController'' is ambiguous between the following action methods:
Espero que el primer método deba actuar cuando no hay parámetros, y el segundo cuando se especifique algún parámetro.
donde me equivoque
UPD : posible duplicado: ¿Se pueden sobrecargar los métodos del controlador en ASP.NET MVC?
UPD 2 : debido al enlace de arriba, no hay ninguna manera legal de hacer una sobrecarga de acción, ¿verdad?
UPD 3 : los métodos de acción no se pueden sobrecargar según los parámetros (c) http://msdn.microsoft.com/en-us/library/system.web.mvc.controller%28VS.100%29.aspx
Puedes hacerlo usando un ActionFilterAttribute que verifica los parámetros usando la reflexión (lo probé) pero es una mala idea. Cada acción distinta debe tener su propio nombre.
¿Por qué no simplemente llama a sus dos métodos "Índice" y "Único", por ejemplo, y vive con la limitación de nombrar?
A diferencia de los métodos que están vinculados en tiempo de compilación basados en firmas coincidentes, un valor de ruta faltante al final se trata como un valor nulo.
Si quieres el [atributo] ActionFilterAttribute que coincide con los parámetros, avísame y publicaré un enlace a él, pero como dije, es una mala idea.
Tendría un método de índice que busca una variable de tipo válida
public class IssueController : Controller
{
public ActionResult Index(string type)
{
if(string.isNullOrEmpty(type)){
return View("viewWithOutType");}
else{
return View("viewWithType");}
}
}
EDITAR:
¿Qué tal crear un atributo personalizado que busque un valor de solicitud específico como en este post
[RequireRequestValue("someInt")]
public ActionResult MyMethod(int someInt) { /* ... */ }
[RequireRequestValue("someString")]
public ActionResult MyMethod(string someString) { /* ... */ }
public class RequireRequestValueAttribute : ActionMethodSelectorAttribute {
public RequireRequestValueAttribute(string valueName) {
ValueName = valueName;
}
public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo) {
return (controllerContext.HttpContext.Request[ValueName] != null);
}
public string ValueName { get; private set; }
}
Todo lo que tienes que hacer es marcar tu segunda acción con [HttpPost]. Por ejemplo:
public class IssueController : Controller
{
public ActionResult Index()
{
// todo: redirect to concrete type
return View();
}
[HttpPost]
public ActionResult Index(string type)
{
return View();
}
}