带有一个必需参数和一个可选参数的ASP.NET MVC路由?

在过去一个月左右的时间里,我一直在研究一个大型MVC应用程序,但这是我第一次需要定义一个自定义路由处理程序,而且我遇到了一些问题。 基本上我有两个参数要通过。 第一个是必需的,第二个是可选的。

我在这里听到这个答案。

这是我的自定义路线:

routes.MapRoute( "MyRoute", "{controller}/{action}/{param1}/{param2}", new { controller = "MyController", action = "MyAction", param1 = "", param2 = "" // I have also tried "UrlParameter.Optional" here. } ); 

我的动作方法签名:

 public ActionResult MyAction(string param1, string param2) 

如果我尝试URL http://[myserver]/MyController/MyAction/Test1/Test2那么它就像我期望的那样工作,param1 =“Test1”和param2 =“Test2”

如果我尝试URL http://[myserver]/MyController/MyAction/Test1那么两个参数都为null。

希望有人可以告诉我这里我做错了什么,因为我迷路了。

我假设您创建了新路线并保留了与您非常相似的默认路线。 您应该知道遍历路由集合以找到第一个匹配的路由。 所以如果你离开了默认的:

 routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults ); 

在您的路线上方,它将匹配请求到http://[myserver]/My/MyAction/Test1并调用MyController.MyAction并将“Text1”设置为名为id参数。 哪个会失败,因为此操作未声明一个名为id

您需要做的是在路线列表中首先移动您的路线,并使其更具体,然后现在:

 routes.MapRoute( "Route", "My/{action}/{param1}/{param2}", new { controller = "My", action = "MyAction", param1 = "", param2 = "" }); 

这将强制通过My路由的所有流量匹配此路由。

嗨,你这样创造你的溃败,我认为这将扼杀你

 routes.MapRoute( "Regis", // Route nameRegister "Artical/{id}", // URL with parameters new { controller = "Artical", action = "Show", id = UrlParameter.Optional } // Parameter defaults ); 

试试这个

 routes.MapRoute("MyRoute", "myRoute/{param1 }/{param2 }", new { controller = "MyController", action = "MyAction", param2 = UrlParameter.Optional }, new { param2 = @"\w+" }); 

您可以使用“ UrlParameter.Optional ”将一个参数指定为可选,并使用DataType指定第二个参数表示如果传递整数值,则表示DataType(@“\ d +”)和字符串i。

注意: 参数序列非常重要可选参数必须最后传递在Gloab.asax中的默认路由之前注册新路由

然后你的动作链接就像

 Test 

或者有一个参数

  Test 

在你的控制器

  public ActionResult MyAction(string param2,string param1) { return View() }