ASP.NET MVC - 引数なしの Html.BeginForm メソッドの動き

HtmlHelper の BeginForm 拡張メソッドはオーバーロードがたくさんありますね。

FormExtensions.BeginForm メソッド (System.Web.Mvc.Html)

そのなかで、引数を渡さないメソッド(引数が HtmlHelper だけのって言った方がいいんでしょうか)は、他のメソッドと少し動きが違うようです。

次の2つの BeginForm メソッドを試してみます。

<!-- 引数なしのBeginForm -->
@using(Html.BeginForm()) {
}

<!-- 引数にアクション名とコントローラ名を渡すBeginForm -->
@using(Html.BeginForm(null, null)) {
}

引数のアクション名やコントローラ名に null を渡すと、現在のリクエストのルートパラメータが使用されるので、この2つのメソッドからは同じ form 要素が作られると思っていました。

ですが、例えば、~/account/login?ReturnUrl=%2fといった URL でアクセスした場合、作られる form 要素は次にようになります。

<!-- 引数なしのBeginForm -->
<form action="/account/login?ReturnUrl=%2f" method="post"></form>

<!-- 引数にアクション名とコントローラ名を渡すBeginForm -->
<form action="/account/login" method="post"></form>

引数なしの BeginForm メソッドで作られた form 要素の action 属性には、クエリ文字列が入っていますね。

MVC のソースを見てもらうとわかるんですが、引数なしのメソッドは、form 要素の action 属性に現在のリクエストの URL を設定しています。それ以外のオーバーロードは、UrlHelper.GenerateUrl メソッドを使って URL を作っているので、このような違いがでます。

以上、BeginForm メソッドの小ネタ?でした。