3

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

为什么会这样?
我能做些什么来解决这个问题?

谢谢。

4

2 回答 2

2

{action}模式是模棱两可的。

要解决此问题,请对特定路线进行硬编码。

例子:

"Service/{controller}/AcceptBid/{id}/{accept}"
于 2012-12-11T09:59:55.043 回答
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 }
);

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

于 2012-12-11T11:50:39.070 回答