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 メソッドの小ネタ?でした。