Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc MVC自定义路由和行为_Asp.net Mvc_Asp.net Mvc Routing_Html.beginform - Fatal编程技术网

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可以提供您想要的内容。有关更多信息,请参阅此链接