ASP.MVCは、詳細アクションなしでルートします
-
18-09-2019 - |
質問
/{controller}/{action}/{id}よりも短いURLを持ちたいです。
たとえば、{controller}/{id}が必要です。ここで、{id}は文字列です。
これにより、ユーザー/ユーザー名などの単純なパス、ページ/ページネーム、ニュース/ニュース名が可能になります。私はこれが、URL(ユーザー/詳細/ユーザー名)で/詳細アクションを要求するよりも好きです。これはエンドユーザーにとってエレガントではありません。
このレベルのシンプルさが必要なコントローラー用のカスタムルートをセットアップすることで、この作業を簡単に作成できます。ただし、これは、{controller}/{action}などの他のアクションの実装に関して頭痛を引き起こします。ここで、{action} = 'create'です。
私の質問:どのようにして「予約」という言葉を持っているので、URLが /news /createである場合、それはアクションとして扱われますが、URLが他の何かである場合、EG /News /A-Gorilla-ate-my-論文、その後、IDとして扱われます。
ルートをセットアップするときにこれを定義できることを願っていますか?
アップデート:
Ben Griswoldの回答を使用して、デフォルトのASP.NET MVCルートを次のように更新しました。
routes.MapRoute(
"CreateRoute", // route name
"{controller}/Create", // url with parameters
new { action = "Create" } // parameter defaults
);
routes.MapRoute(
"DetailsRoute", // route name
"{controller}/{id}", // url with parameters
new { action = "Details" } // parameter defaults
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
これは魅力で機能し、デフォルトでは詳細ページが簡素化されたURLを使用しますが、必要に応じて特定のアクションをターゲットにすることができます(更新/削除/詳細)。
もちろん、予約された「作成」という単語をIDとして禁止する必要があります。そうしないと、ユーザーは、たとえば、アクセスできない「Create」という名前の記事を作成しようとすることができます。
これは本当にいいです。誰かがこのアプローチに何か問題があると思ったら、チャイムを入れてください。しかし、私はこれまでのところそれが好きです。
解決
予約された単語ごとにルートを作成することに残されていると思います。例えば、
routes.MapRoute("CreateRoute",
"{controller}/Create",
new { action = "Create" }
);
このルートが他のカスタムルートの前にリストされている限り、ハンドル /ニュース /作成、 /create /createなど。
同様のパターンに従うさまざまなCRUD操作に追加ルートが必要になると思います。