我在过去一个月左右的时间里一直在研究大型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
,则两个参数均为空。
希望有人可以告诉我这里我做错了什么,因为我迷路了。
答案 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()
}