我添加了自定义路线:
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"
都由我的自定义路由处理,但所有其他网址都由默认路由处理。
答案 0 :(得分: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()
)
);