为什么需要为Html.Action定义的路由?

时间:2012-01-20 01:32:59

标签: asp.net-mvc routes

我创建了一个空的ASP.NET MVC 3应用程序,其中包含2个控制器,HomeControllerOtherController

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!

现在,我从Global.asax.cs中取默认RegisterRoutes

    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

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

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

现在,当我运行该页面时,它会崩溃并显示以下错误消息:

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

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

3 个答案:

答案 0 :(得分: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进行解析,URLRoutingModule使用路由表来决定要做什么。由于您没有匹配的路线 - 您会收到错误。

修改

在我的诽谤中,我实际上没有说明你的最后陈述。你是对的,没有生成URL,但是生成了对应用程序的请求。 HTML.Action仍将使用路由来确定要使用的控制器,操作,区域和参数。我认为用简单的术语说它就像生成一个ActionLink并为你点击它一样公平。

答案 1 :(得分:0)

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

  

InvalidOperationException无法找到所需的虚拟路径数据。

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

答案 2 :(得分:0)

我的解决方案如下:

我有以下一行给我一个错误:

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

添加thrid参数解决了错误:

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