ActionLinkは、現在のルートデータを参照してくれる
/Person/Details/1 で表示されるViewに、編集リンクを追加したい時は、
スキャフォールディングにもある通り以下のように書くことができます。
@Html.ActionLink("編集へ", "Edit", new { personId = Model.Id })
が、ルーティングを設定すると
@Html.ActionLink("編集へ", "Edit")
と、パラメータを指定しなくても、personId に値が入ったURLが生成されます。
RedirectToActionも
また、編集後、詳細画面へリダイレクトしたい時に書く、
Controllerのアクションメソッド内のコード、
return RedirectToAction("Edit", new { personId = person.Id });
も、
return RedirectToAction("Edit");
このようにパラメータを省略して書くことができます。
RedirectToActionやActionLinkは、現在のルートデータを参照して
URLを生成してくれます。
準備
上のようにするためには、ルーティングの設定が必要です。
routes.MapRoute( name: "Edit", url: "Person/Edit/{personId}", defaults: new { controller = "Person", action = "Edit" } ); routes.MapRoute( name: "Details", url: "Person/Details/{personId}", defaults: new { controller = "Person", action = "Details" } );
{personId} とあるように、セグメントを使ってルートデータを定義します。
ちなみに、下のように{action}と書いて1つのルーティングで済むようににすると、
省略してもURLを生成してくれません。(URL→Controllerのルーティングはうまくいきます。)
routes.MapRoute( name: "PersonAction", url: "Person/{action}/{personId}", defaults: new { controller = "Person" } );
あと、クエリ文字列は参照してくれません。