2012-01-20 10 views
8

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?

Respuesta

4

creo que esta entrada del blog le ayudará a entender un poco más:

http://blogs.charteris.com/blogs/gopalk/archive/2009/01/20/how-does-asp-net-mvc-work.aspx.

Básicamente, el enrutamiento consiste en determinar qué controlador 'encenderá' para manejar la solicitud y la acción apropiada a invocar en función de los parámetros que envió y MVCRouteHandler los utiliza para tomar una decisión. Solo porque le diga qué controlador en su acción no lo hace ignorar mágicamente la tabla de enrutamiento, vaya directamente a esa clase de controlador y omita todas las bondades de MVC que suceden en el back-end. Recuerde, estos métodos @HTML.Action pueden tomar una gran cantidad de sobrecargas que podrían influir en qué ruta usar en la tabla de enrutamiento (piense en la estructura de la URL, por ejemplo).

Las rutas MVC no tienen contenido estático y, como tales, deben analizarse a través del URLRoutingModule que utiliza la tabla de enrutamiento para decidir qué hacer. Como no tiene una ruta coincidente, obtiene un error.

EDITAR

En mi diatriba, que en realidad no dirija su declaración final. Tiene razón, no se generó ninguna URL, pero se generó una solicitud a la aplicación. HTML.La acción todavía usará el enrutamiento para determinar qué controlador, acción, área, parámetros usar. Creo que es justo decir en términos simples que es como generar un ActionLink y hacer clic para usted.

+0

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? –

+1

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

0

El enrutamiento se involucró al usar Html.Action en un controlador. Cuando el motor no pudo encontrar el "Otro" HtmlHelper con una acción de "Índice", de manera predeterminada pasó a ejecutar esa ruta, lo que significa pasar por el enrutamiento. Ninguna ruta coincide, por lo que arrojó un error.

InvalidOperationException The required virtual path data cannot be found.

http://msdn.microsoft.com/en-us/library/ee721266.aspx

0

La solución para mí fue como sigue:

que tenían la siguiente línea que me daba un error:

@{Html.RenderAction("ActionName", "ControllerName");} 

Adición de un parámetro thrid solucionado el error:

@{Html.RenderAction("ActionName", "ControllerName", new { area = string.Empty });} 
Cuestiones relacionadas