Asp.net mvc MVC自定义路由和行为
我添加了一条自定义路线:Asp.net mvc MVC自定义路由和行为,asp.net-mvc,asp.net-mvc-routing,html.beginform,Asp.net Mvc,Asp.net Mvc Routing,Html.beginform,我添加了一条自定义路线: RouteTable.Routes.Insert( 0, new Route( "common/scripts", new EmbeddedScriptRouteHandler() ) ); 现在,每当我使用BeginForm在视图中呈现表单标记时,BeginForm生成的URL都已更改。因此,例如,如果没有这个自定义路由,@Html.BeginForm(“Index”,“Home”)将生成一个带有动作“/Hom
RouteTable.Routes.Insert(
0,
new Route(
"common/scripts",
new EmbeddedScriptRouteHandler()
)
);
现在,每当我使用BeginForm在视图中呈现表单标记时,BeginForm生成的URL都已更改。因此,例如,如果没有这个自定义路由,@Html.BeginForm(“Index”,“Home”)
将生成一个带有动作“/Home/Index”
的表单标记。一旦我添加了这个新路由,表单标记操作就变成了“/common/scripts?action=Index&controller=Home”
。为什么会发生变化
我期望的结果是,任何URL
“/common/scripts”
都由我的自定义路由处理,但所有其他URL都由默认路由处理。它已更改,因为该路由作为第一个路由包含,因此当MVC尝试生成URL时,它将始终找到该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()
)
);
Html.BeginRouteForm可以提供您想要的内容。有关更多信息,请参阅此链接