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

Jac*_*all 8 asp.net-mvc routes

我已创建了2个控制器的其他空ASP.NET MVC 3应用,HomeControllerOtherController.

HomeController.cs看起来像这样:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

Index.cshtml看起来像这样:

@Html.Action("Index", "Other")
Run Code Online (Sandbox Code Playgroud)

而且,当然,Othercontroller.cs:

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

到现在为止还挺好.我运行应用程序,它告诉我一切都是OK!

现在,我采用RegisterRoutesGlobal.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
        );
    }
Run Code Online (Sandbox Code Playgroud)

我把它弄皱了,所以没有路线匹配OtherController:

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

        routes.MapRoute("Default", "", new { controller = "Home", action = "Index" });
    }
Run Code Online (Sandbox Code Playgroud)

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

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

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

Tom*_*mmy 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 并为您单击它一样。