2012-01-20 31 views
8

我创建了一个空的ASP.NET MVC 3应用程序,带有2个控制器,HomeControllerOtherController为什么你需要一个为Html.Action定义的路由?

HomeController.cs看起来是这样的:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

Index.cshtml看起来是这样的:

@Html.Action("Index", "Other") 

,当然,Othercontroller.cs:

public class OtherController : Controller 
{ 
    [ChildActionOnly] 
    public ActionResult Index() 
    { 
     return Content("OK!"); 
    } 
} 

到目前为止, 太好了。我运行应用程序,它告诉我一切都OK!

现在,我把默认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 
     ); 
    } 

我揉碎了起来,所以没有路由匹配OtherController

System.InvalidOperationException: No route in the route table matches the supplied values. 
Source Error: 
Line 1: @Html.Action("Index", "Other") 

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute("Default", "", new { controller = "Home", action = "Index" }); 
    } 

现在,当我运行的页面,它与此错误消息崩溃

我在.Action的调用中指定了控制器名称和操作名称。没有URL正在生成,也没有请求正在进行。 为什么路由甚至需要参与?

回答

4

我认为这篇博客文章将帮助您了解更多一点:

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

实质上,路由参与确定哪个控制器'启动'来处理请求,并根据您发送的参数和MVCRouteHandler使用这些参数来做出决定来调用适当的操作。仅仅因为你告诉它你的行为中的哪个控制器不会让它神奇地忽略路由表,就直接去找那个控制器类,并绕过在后端发生的所有其他MVC优点。请记住,这些@HTML.Action方法可能会承担大量重载,这些重载可能会影响路由表中的哪个路由使用(例如,请考虑URL结构)。

MVC路径不是静态内容,因此必须通过使用路由表决定做什么的URLRoutingModule进行分析。既然你没有匹配的路线 - 你会得到一个错误。

编辑

在我的谩骂,我并没有真正解决您的最后陈述。你是对的,没有生成URL,但生成了对应用程序的请求。 HTML。Action仍将使用路由来确定要使用的控制器,操作,区域和参数。我认为用简单的术语来说这很公平,就像生成一个ActionLink并为你点击它一样。

+0

谢谢您。这可能有助于给出一个会影响使用哪条路线的重载示例。你能想到一个简单的吗? –

+1

在这里,在家里的最后时刻(yum,wine),首先想到的就是在你的路线价值字典中使用一个区域。没有路由处理程序,MVC如何知道要查找控制器的哪个名称空间,或者它是否是操作的参数。 - > @ Html.Action(“Action”,“Controller”,new {area =“Admin”})。另外,命名路由可能是另一个例子,您只需传递路由的名称,并且不一定需要传递控制器的操作参数,因为它们可以在命名的路由定义中定义。 – Tommy

0

路由通过在控制器上使用Html.Action而受到影响。当引擎找不到“索引”动作的“其他”HtmlHelper时,默认执行该路径,这意味着要通过路由。没有路由匹配,所以它抛出了一个错误。

InvalidOperationException The required virtual path data cannot be found.

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

0

对我来说,溶液如下:

我有以下行这是给我的错误:

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

添加THRID参数解决了这个错误:

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