【问题标题】:Why do you need a route defined for Html.Action?为什么需要为 Html.Action 定义路由?
【发布时间】:2012-01-20 01:32:59
【问题描述】:

我创建了一个带有 2 个控制器 HomeControllerOtherController 的空 ASP.NET MVC 3 应用程序。

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,也没有发出请求。 为什么路由还需要参与?

【问题讨论】:

    标签: asp.net-mvc routes


    【解决方案1】:

    我认为这篇博文会帮助你了解更多:

    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 并单击它。

    【讨论】:

    • 谢谢。给出一个会影响使用哪个路由的过载的具体示例可能会有所帮助。你能想到一个简单的吗?
    • 在家里的深夜(yum,wine),第一个想到的就是使用路线值字典中的一个区域。如果没有路由处理程序,MVC 将如何知道要查找控制器的名称空间,或者它是否是操作的参数。 -> @Html.Action("Action", "Controller", new {area = "Admin"})。此外,命名路由可能是另一个示例,您只需传递路由的名称,不一定需要传递控制器、操作参数,因为它们可以在命名路由定义中定义。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      我的解决方案如下:

      下面这行给了我一个错误:

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

      添加第三个参数解决了错误:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-17
        • 1970-01-01
        • 1970-01-01
        • 2017-01-30
        • 2017-11-24
        • 2019-03-10
        • 1970-01-01
        相关资源
        最近更新 更多