2

@Url.Action を非標準のルート構造を持つエリアで機能させるのに問題があります。

たとえば、このルートをダッシュ​​ボード エリアに登録すると、次のようになります。

        context.MapRoute(
            "Dashboard_default",
            "Dashboard/{controller}/{action}/{id}",
            new { controller = "View", action = "Display", id = UrlParameter.Optional }
        );

そして、レイアウト ビューで次のように呼び出します。

        @Url.Action("Select", "View", new { area = "Dashboard" })

適切な URL を取得します: /Dashboard/View/Select

ただし、ルートを変更して、次のようなオプションのセカンダリ ID を含めると:

        context.MapRoute(
            "Dashboard_default",
            "Dashboard/{controller}/{action}/{id}/{secondaryid}",
            new { controller = "View", action = "Display", id = UrlParameter.Optional, secondaryid = UrlParameter.Optional }
        );

次に、 @Url.Action(...) への同じ呼び出しは、URL を返しません。これらのオプションのパラメーターを実際の値で指定すると、次のようになります。

        @Url.Action("Select", "View", new { area = "Dashboard", id = 1, secondaryid = 2 })

私は神の戻り値を取得します: /Dashboard/View/Select/1/2

問題は、この領域での私のアクションの一部が ID またはセカンダリ ID を必要とせず、それらなしで URL を生成したいことです。それらを (int?)null に設定しても、まだ機能しません。

私は何か間違ったことをしていますか?routeValues パラメータでそれらを指定しない場合、Url.Action(...) は id および secondaryid トークンなしで URL を返すべきではありませんか?

4

1 に答える 1

3

オプションのパラメータを複数持つと、ルートに奇妙なことが起こります。基本的に、ルート エンジンは、オプション パラメータのグループがある場合、1 つまたはまったく一致しない (問題がある) ことができません。詳細については、同じ問題に関するこのブログ投稿を確認してください。

ID やセカンダリ ID は必ずしも必要ではないため、これらのケースを処理するためにいくつかのルートを作成するだけです。

context.MapRoute(
            "Dashboard_IdAndSecondaryId",
            "Dashboard/{controller}/{action}/{id}/{secondaryid}",
            new { controller = "View", action = "Display"}
        );
context.MapRoute(
            "Dashboard_default_WithSecondaryId",
            "Dashboard/{controller}/{action}/{secondaryid}",
            new { controller = "View", action = "Display"}
        );

context.MapRoute(
            "Dashboard_default",
            "Dashboard/{controller}/{action}/{id}/",
            new { controller = "View", action = "Display", id = UrlParameter.Optional}
        );

これで、Id のみ、secondaryId のみ、またはその両方を送信すると、一致するルートが得られます。最初の 2 つのルートでオプションのパラメーター宣言を削除できます。これは、そのルートに一致させるために必要なパラメーターを送信する必要があるためです。必要なパラメーターを送信しないと、最後のルートのみが一致する必要があります。

アクション リンクで Id のみが送信されるか、何も送信されない場合、最後のルートがデフォルト ルートになります。この順序も同様に機能すると思いますが、ルートが順番に処理されることを考えると、ルートを最も具体的なものから最も具体的でないものへと移動させることを念頭に置いてください。

于 2012-11-30T17:47:22.827 に答える