MVC自定义路由和BeginForm行为

时间:2014-08-21 05:48:37

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

我添加了自定义路线:

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

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

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

1 个答案:

答案 0 :(得分:0)

它已更改,因为该路由作为第一个路由包含在内,因此当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()
    )
);