miso_soup3 Blog

主に ASP.NET 関連について書いています。

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" }
);

あと、クエリ文字列は参照してくれません。

ロジックがきになる…

ActionLinkやRedirectToActionは、URL生成を同じ所から取得しています。(UrlHelperのGenerateUrl()メソッドです)
ルートデータから、URLを生成する際のロジックが気になっておっかけてたのですが
MVC内にはありません。ASP.NETの範疇みたいです。