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

jeb*_*ar8 13 c# asp.net-mvc url-routing asp.net-mvc-routing asp.net-mvc-3

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

我在这里听到这个答案.

这是我的自定义路线:

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

我的动作方法签名:

public ActionResult MyAction(string param1, string param2)
Run Code Online (Sandbox Code Playgroud)

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

如果我尝试URL,http://[myserver]/MyController/MyAction/Test1则两个参数都为空.

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

Raf*_*fal 13

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

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

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

您需要做的是将您的路线作为路线列表中的第一个路线移动,并使其更具体,然后现在:

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

这将强制所有路由的流量My匹配此路由.