13

在过去一个月左右的时间里,我一直在开发一个大型 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,那么两个参数都为空。

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

4

3 回答 3

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与此路由匹配。

于 2012-10-05T05:45:02.633 回答
1

嗨,你像这样创建你的溃败,我认为这会帮助你

routes.MapRoute(
                "Regis", // Route nameRegister
                "Artical/{id}", // URL with parameters
                new { controller = "Artical", action = "Show", id = UrlParameter.Optional } // Parameter defaults
            );
于 2012-10-05T05:31:57.450 回答
1

试试这个

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

您可以使用“ UrlParameter.Optional ”将一个参数指定为可选参数,并使用 DataType 指定第二个参数意味着如果您传递整数值,则 DataType (@"\d+") 和我上面提到的字符串。

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

然后你的动作链接就像

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

或只有一个参数

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

在你的控制器中

 public ActionResult MyAction(string param2,string param1)
 {
   return View()
 }
于 2012-10-05T06:09:46.257 回答