2

アプリのルートを次のように変更するというこの目標を達成しようとしています。

hxxp://host/MyController/Widgets/3/AddWhatsit

このルートのビューは、ユーザーがウィジェット 3 に Whatsit を追加するのに役立ちます。

同様に、新しいウィジェットを作成するルートは次のようになると思います。

hxxp://host/MyController/Widgets/Create

これを容易にするために、別のルートを作成しました。彼らです:

           routes.MapRoute("DefaultAction",
                            "{controller}/{action}",
                            new {controller = "Home", action = "Index"});

           routes.MapRoute("Default",
                            "{controller}/{id}/{action}",
                            new {controller = "Home", action = "Index", id = UrlParameter.Optional});

私が抱えている問題は、ウィジェットのインデックス ページ (/MyController/Widgets、「DefaultAction」ルートに一致する) を参照すると、そのルートの一部ではない新しい URL パラメーターを導入するすべての ActionLinks がクエリ文字列に変換されることです。価値。したがって、たとえば、ウィジェット 3 の編集リンクは次のようにレンダリングされます: Widget/Edit?id=3 instead of (what I would prefer): Widget/3/Edit

ルートの最後に(オプションの) id パラメータを付けないことで、物事を台無しにしていることを理解していると思います。

私はそれを吸い上げて、ルートの最後に id を残すべきですか?

4

2 に答える 2

2

これを達成することは可能です。/Home/1/Index のようなアンカー リンクを取得するには、次のようにルートを設定します。

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Custom",
        url: "{controller}/{id}/{action}"
        );

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

そして、ビューで:

@Html.ActionLink("Here", "Index", "Home", new { id = 5 }, null)

そして、次のようにレンダリングされたリンクを取得します。

<a href="/Home/5/Index">Here</a>

Quirk は、カスタム ルートを制約することです。この場合、デフォルトを削除しましたが、意味がありません。もちろんルート順も。

于 2013-03-21T20:41:51.717 に答える
1

ルートの順序を変更する必要があると思います。MVC はルート リストを調べて、最初に一致するルートを選択することに注意してください。ID パラメーターを使用した 2 番目のルートはより具体的であるため、ルーティング テーブルの最初に来る必要があります。

ActionLink で ID パラメーターを指定しましたが、コントローラーとアクションも指定しました。したがって、RoutingEngine によって最初のルートが選択されます。

最後に、ID 属性のオプション パラメータを削除します。Id を持っているときにそのルートを選択したいので、それをオプションのパラメーターにしたくないので、そのルートと一致するように要求する必要があります。

routes.MapRoute("Default","{controller}/{id}/{action}", 
   new {controller = "Home", action = "Index"});

routes.MapRoute("DefaultAction", "{controller}/{action}", 
  new {controller = "Home", action = "Index"});
于 2013-03-21T20:42:02.190 に答える