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

时间:2012-10-05 04:48:48

标签: c# asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing url-routing

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

我跟着这个回答here

这是我的自定义路线:

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)

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

如果我尝试使用网址http://[myserver]/MyController/MyAction/Test1,则两个参数均为空。

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

3 个答案:

答案 0 :(得分:13)

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

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路由的所有流量匹配此路由。

答案 1 :(得分:1)

嗨,你这样创建你的路由器,我认为这将有助于你

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

答案 2 :(得分:0)

试试这个

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中默认路由之前注册新路由

然后你就像

这样的动作链接
<a href="@Url.RouteUrl("MyRoute", new { param2 = "Test1",param1 = "Test2"})">Test</a>

OR或一个参数

  <a href="@Url.RouteUrl("MyRoute", new { param2 = "Test1"})">Test</a>

在你的控制器

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