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 値に設定されます。しかし、2 番目のリンクをクリックすると、コントローラー メソッドの Id パラメーターが設定されましたが、2 番目のパラメーター (Bid) は null です。

なぜこれが起こるのですか?
この問題を解決するにはどうすればよいですか?

ありがとう。

4

2 に答える 2

2

{action}パターンがあいまいです。

これを回避するには、特定のルートをハードコーディングします。

例:

"Service/{controller}/AcceptBid/{id}/{accept}"
于 2012-12-11T09:59:55.043 に答える
2

問題の説明

出力ルーティング (リンク生成) は問題ありませんでした。問題は着信ルーティングにあります。最初のルートによって処理される必要がある 2 番目のリンクをクリックすると、実際には最初のルートによって処理されます。これは、その定義と一致するためです。

考えられる解決策 (ハードコーディング アクションなし)

必要なのは、最初のルートに追加の制約を提供して、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 に答える