1

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

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

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

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

4

1 回答 1

0

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

您可以在路由定义中添加一个段scriptName(即使您的路由处理程序不会使用它)。这样,除非您为scriptName.

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()
    )
);
于 2014-08-21T07:40:18.110 回答