【问题标题】:MVC custom route and BeginForm behaviourMVC 自定义路由和 BeginForm 行为
【发布时间】:2014-08-21 05:48:37
【问题描述】:

我添加了一条自定义路线:

RouteTable.Routes.Insert(
    0,
    new Route(
        "common/scripts",
        new EmbeddedScriptRouteHandler()
    )
);

现在,每当我使用 BeginForm 在视图中呈现 Form 标记时,BeginForm 生成的 URL 都会发生变化。因此,例如,如果没有此自定义路由,@Html.BeginForm("Index", "Home") 将生成一个带有操作"/Home/Index" 的表单标记。一旦我添加了这个新路由,表单标签操作就变成了"/common/scripts?action=Index&controller=Home"。为什么会发生这种变化?

我想要的结果是任何 URL "/common/scripts" 都由我的自定义路由处理,但所有其他 URL 都由默认路由处理。

【问题讨论】:

标签: asp.net-mvc asp.net-mvc-routing html.beginform


【解决方案1】:

它发生了变化,因为该路由被包含为第一条路由,因此当 MVC 尝试生成一个 url 时,它总是会找到那个。因为它没有段或默认值,所以路由始终匹配,并且任何参数(如控制器/动作)都包含在查询字符串值中。

您可以在scriptName 的路由定义中添加一个段(即使您的路由处理程序不会使用它)。这样,除非您传递 scriptName 的值,否则在生成 Url 时不会选择此路由。

RouteTable.Routes.Insert(0,
    new Route(
        "common/scripts/{scriptName}",
        new EmbeddedScriptRouteHandler()
    )
);

另一个选项是为控制器设置一个默认值,它与您的任何控制器都不匹配。这样在 MVC 中生成 url 时,该路由将始终被排除,因为您的任何控制器都不会匹配该值。当您使用自定义路由处理程序时,这在解析传入路由时应该没有其他影响。

类似这样的:

RouteTable.Routes.Insert(0,
    new Route(
        "common/scripts",    
        new RouteValueDictionary(new { controller = "AControllerThatDoesntExists"}),
        new EmbeddedScriptRouteHandler()
    )
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多