ASP.NET MVC 4 RouteLink无法正常工作

时间:2012-12-11 09:54:33

标签: c# asp.net-mvc routing asp.net-mvc-4

在我的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)为空。

为什么会这样? 我该怎么做才能解决这个问题?

感谢。

2 个答案:

答案 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 }
);

这将使您的路线比为每个单独的操作创建静态路由定义更具动态性。