世界中でMVC v2祭りな雰囲気の中、少し前にリリースのあったT4MVC 2.4.0.1について。早くMVC祭りに参加したいところだけど、そこは焦らずに少しずつ...。
前回のT4MVCの投稿でActionNameをサポートするようttファイルの書き換えを行ったけど、新しいバージョンではしっかりとその辺も含めた改良が施されてます。なので、もうActionNameで名前を変えたものを指定したいからと、たけはらエディションを使う必要は全く無くなりました。
どうやってActionName属性を取り出すのかなと確認したところ、メソッドのCodeAttribute2を取り出してActionNameAttributeが付いてるかを見てました。ActionMethodInfoが変更かかってるのも合わせて、やり方はだいたい同じですね。間違ってなくてホッとした。変更前のAction名が選択肢に出てくるあたりの仕様も同じだし。
HomeControllerに以下のIndexPostを追加してみる。
public virtual ActionResult Index() { ViewData["Message"] = "Welcome to ASP.NET MVC!"; return View(); } [AcceptVerbs(HttpVerbs.Post)] [ActionName("Index")] public virtual ActionResult IndexPost(string value) { ViewData["Message"] = "Welcome to ASP.NET MVC!"; return View(); }
このIndexPostを参照するようにIndex.aspxにFORMを書いてみる。
<% using (Html.BeginForm(MVC.Home.Actions.IndexPost, MVC.Home.Name)) { %> <input type="submit" value="送信" /> <% } %>
結果、出力されるHTMLは↓。
<form action="/" method="post"> <input type="submit" value="送信" /> </form>
それから、既定ではMVCがクラス名だったり、ViewsフォルダやControllersが固定だったけど、今回からT4MVC.settings.t4というファイルで変更出来るようになってます。なので、MVC.Home.~じゃ無くてMy.Home.~とかに変更も可能。サブディレクトリを再帰(なんちゃらRecursive関数達)で潜っていくようになってるので、より実用的に。
Actionの引数をなくしたoverloadを定義してるみたで、上記BeginFormの書き方を以下のように変えてもOKらしい。
<% using (Html.BeginForm(MVC.Home.IndexPost())) { %> <input type="submit" value="送信" /> <% } %>
だけど、これで出力されるURLがなんかキモイ。
<form action="/?RouteValues=System.Web.Routing.RouteValueDictionary" method="post"> <input type="submit" value="送信" /> </form>
変なの。と、思って出力されたコードを確認してみたけど、今回のような使い方の場合、上記のようにBegineFormを使うと、標準のHtmlHelper.BeginFormが呼ばれるから変なURLになる。正しくは↓こう。
<% using (Html.BeginForm(MVC.Home.IndexPost(), FormMethod.Post)) { %> <input type="submit" value="送信" /> <% } %>
ちゃんと、FormMethodを指定しましょう。じゃないと、T4MVCで定義してるBeginFormのoverloadに入ってこないもん。こうすれば、ちゃんとURLが出てくるようになりました。にゃろめ。ちなみにルーティング登録時(MapRoute)でもマジックストリングを使わずに登録できるようになってるT4MVC。
最高です。