在我的MVC 4应用程序中,我使用了Area,这是我的路线:
context.MapRoute(
"Service_AcceptBid",
"Service/{controller}/{action}/{id}/{accept}",
new { area = "Service", controller = "Project", action = "AcceptBid", id = UrlParameter.Optional, accept = UrlParameter.Optional }
);
context.MapRoute(
"Service_BidNegotiation",
"Service/{controller}/{action}/{id}/{bid}",
new { area = "Service", controller = "Project", action = "Negotiations", id = UrlParameter.Optional, bid = UrlParameter.Optional }
);
我将这些链接放在我的.cshtml页面上:
<div dir="ltr">
@Html.RouteLink("Accept", "Service_AcceptBid", new { controller = "Project", action = "AcceptBid", Id = item.ProjectId, Accept = item.Id })
@Html.RouteLink("Negotiate", "Service_BidNegotiation", new { controller = "Project", action = "Negotiations", Id = item.ProjectId, Bid = item.Id })
</div>
点击第一个链接后,调用AcceptBid
控制器并将其参数(Id,Accept)设置为url值。但当我点击第二个链接时,控制器方法中的Id参数已设置,但第二个参数(Bid)为空。
为什么会这样? 我该怎么做才能解决这个问题?
感谢。
答案 0 :(得分:2)
{action}
模式不明确。
要解决此问题,请对特定路线进行硬编码。
示例:
"Service/{controller}/AcceptBid/{id}/{accept}"
答案 1 :(得分:2)
输出路由(链路生成)很好。问题在于传入路由。当您单击应由第一个路由处理的第二个链接时,它实际上由第一个路由处理,因为它与其定义匹配。
您所要做的就是为第一条路线提供额外的限制,以防止它处理应由第二条路线处理的请求。
检查我的以下代码更改,我在action
参数上添加了路由约束,以提供可能的值:
context.MapRoute(
"Service_AcceptBid",
"Service/{controller}/{action}/{id}/{accept}",
new { area = "Service", controller = "Project", action = "AcceptBid", id = UrlParameter.Optional, accept = UrlParameter.Optional },
new { action = "AcceptBid|RejectBid|..." }
);
context.MapRoute(
"Service_BidNegotiation",
"Service/{controller}/{action}/{id}/{bid}",
new { area = "Service", controller = "Project", action = "Negotiations", id = UrlParameter.Optional, bid = UrlParameter.Optional }
);
这将使您的路线比为每个单独的操作创建静态路由定义更具动态性。