【问题标题】:ASP.NET MVC 4 RouteLink not workingASP.NET MVC 4 RouteLink 不起作用
【发布时间】:2012-11-28 20:27:18
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 不,大小写相同。小写也不行。

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


【解决方案1】:

解释问题

输出路由(链接生成)很好。问题在于传入路由。当您单击应该由第一个路由处理的第二个链接时,它实际上由第一个路由处理,因为它符合其定义。

可能的解决方案(没有硬编码操作)

您所要做的就是为第一个路由提供额外的约束,以阻止它处理应该由第二个路由处理的请求。

检查我在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 }
);

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

【讨论】:

  • 非常感谢 :-) 这是避免硬编码的最佳方法。效果很好。
【解决方案2】:

{action} 模式不明确。

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

例子:

"Service/{controller}/AcceptBid/{id}/{accept}"

【讨论】:

  • 谢谢,我将这条路线改为硬编码,它正在工作。但是为什么没有硬代码我不能做到这一点呢?
  • @Mojtaba:您的链接按预期创建,但是当您单击它时,它由第一个路由处理,该路由未定义Bid 参数,而是定义accept。您可以使用非硬编码路由,但它需要对其进行一些限制,这样它就不会捕获应该由第二条路由处理的传入请求。
猜你喜欢
  • 2013-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多