He creado una aplicación ASP.NET MVC 3 que de lo contrario estaría vacía con 2 controladores, HomeController
y OtherController
.¿Por qué necesita una ruta definida para Html.Action?
HomeController.cs se ve así:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}
Index.cshtml se ve así:
@Html.Action("Index", "Other")
Y, por supuesto, Othercontroller.cs:
public class OtherController : Controller
{
[ChildActionOnly]
public ActionResult Index()
{
return Content("OK!");
}
}
Hasta ahora , tan bueno. Funciono con la aplicación, y me dice que todo está OK!
Ahora, tome el valor por defecto de RegisterRoutes
Global.asax.cs:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
Y arrugarse hacia arriba, de modo que no hay rutas coinciden OtherController
:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute("Default", "", new { controller = "Home", action = "Index" });
}
Ahora, cuando corro a la página, que se bloquea con el siguiente mensaje de error:
System.InvalidOperationException: No route in the route table matches the supplied values.
Source Error:
Line 1: @Html.Action("Index", "Other")
Especifiqué el nombre del controlador y el nombre de la acción en la llamada al .Action
. No se generan URL y no se realizan solicitudes. ¿Por qué el enrutamiento incluso debe involucrarse?
Gracias tú. Podría ser útil dar un ejemplo específico de una sobrecarga que influiría en qué ruta usar. ¿Puedes pensar en uno simple? –
En las últimas horas aquí en casa (mmm, vino), la primera que se me ocurre sería utilizar un área en tu diccionario de valor de ruta. Sin el manejador de ruta, ¿cómo sabría MVC qué espacio de nombres buscar el controlador o si era un parámetro de una acción? -> @ Html.Action ("Acción", "Controlador", nuevo {area = "Admin"}). Además, las rutas con nombre podrían ser otro ejemplo, donde simplemente se pasa el nombre de la ruta y no necesariamente es necesario pasar los parámetros de acción del controlador, ya que podrían definirse en la definición de ruta nombrada. – Tommy