我有一个控制器测试有以下行动
public ActionResult ABC (string parameter1, string parameter2)
public ActionResult XYZ (string parameter1, string parameter2,string parameter3, string parameter4)
我添加了以下html.routelinks
<%= Html.RouteLink("ABC","ABC", new { parameter1 = 100, parameter2 = 200 } )%><br />
<%= Html.RouteLink("XYZ", "XYZ", new { parameter1 = 1000 , parameter2 = 2000 }) %>
XYZ动作中的最后两个参数是选项,所以我在Html.routelink中省略了它们
routes.MapRoute("ABC", "Test/{parameter1}{parameter2}", new { controller = "Test", action = "ABC", parameter1= 0,parameter2=0 });
routes.MapRoute("XYZ", "Test/{parameter1}{parameter2}{parameter3}{parameter4}", new { controller = "Test", action = "XYZ", parameter1=0,parameter2=0 ,parameter3=UrlParameter.Optional,parameter4=UrlParameter.Optional});
在上述两个案例中,同样的路线“ABC”被称为尽管我点击了第二个Html.routelink。 有谁能解决这个问题?如何根据路线名称而不是参数数量进行路线?
答案 0 :(得分:0)
首先,您需要将路由参数与/
分开,否则您将收到运行时错误:
routes.MapRoute("ABC", "Test/{parameter1}/{parameter2}",
new {
controller = "Test",
action = "ABC",
parameter1 = 0,
parameter2 = 0
}
);
routes.MapRoute("XYZ", "Test/{parameter1}/{parameter2}/{parameter3}/{parameter4}",
new {
controller = "Test",
action = "XYZ",
parameter1 = 0,
parameter2 = 0,
parameter3 = UrlParameter.Optional,
parameter4 = UrlParameter.Optional
}
);
然后,当您生成两个链接时,您指定了相同的参数:parameter1
和parameter2
,并且由于您未在路线中指定任何操作部分,因此无法在这两个链接之间消除歧义。路由引擎无法知道要调用的操作,因此它只是选择路由定义中的第一个路由(这就是订单重要的原因)。如果您指定不同的参数,那么它将起作用:
<%= Html.RouteLink("ABC","ABC", new { parameter1 = 100, parameter2 = 200 } )%>
<br />
<%= Html.RouteLink("XYZ", "XYZ", new { parameter3 = 1000 , parameter4 = 2000 }) %>