public ActionResult Users()
{
ViewData["ViewMessage"] = "今日も雨が降ったり止んだりだね。";
var users = new List()
{
new Models.UserViewData(){UserName = "takehara", ViewName="たけはら", Message="運動不足"},
new Models.UserViewData(){UserName = "mauri", ViewName="マウリ", Message="ホッケーばっかり"},
new Models.UserViewData(){UserName = "suzuki", ViewName="すずき", Message="ホッケーのみ"}
};
return View(users);
} 6.Home/Index.aspxにリンク作成。
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Home.Index" %>
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
<h2><%= Html.Encode(ViewData["Message"]) %></h2>
<p>
To learn more about ASP.NET MVC visit <a href="http://asp.net/mvc" title="ASP.NET MVC Website">http://asp.net/mvc</a>.
</p>
<%= Html.ActionLink("ユーザーページ", "Users") %>
</asp:Content> で、これを実行した結果の画面が↓これ。
相変わらず、ViewDataが参照できてないですね。
が!!
RenderPartialには違うオーバーロードがあってですね、User.aspxのコードを以下のように変更。
<%
foreach(var user in ViewData.Model)
Html.RenderPartial("~/Views/UserControls/User.ascx", user, ViewData);
%> すると...。
あびりーばぼー!!
ViewDataDictionaryの中身をUserControlの中から参照できるようになりました。
今までのRenderUserControlだと型指定してViewDataを渡すとディクショナリの中身は見れなくなってたんだけど、これでそのページで利用したい情報はすべてViewDataDictionaryに入れておくことで、全部のUserControlから参照できるようになりますね。
最高っす!!
ここで、RenderPartialが直接結果を返さないのがミソ。実行はギリギリまで遅らせてTestしやすくってことですな。モック使ってね。
次に変わってんのがHtmlHelper.ActionLink/RouteLinkのオーバーロード。object型の引数の解釈が先にHtmlAttributes。ちゃんとUrlが生成されなくてビビるので気をつけましょう。
今までのコードをなるべくそのまま使うなら↓こんな感じでnull渡しましょう。
Html.RouteLink("リンク", "RouteName", new {val1="1", val2="2"},null)
HtmlHelperはいろいろ変更が多そうだけど、ここら辺押さえておけば以降は大丈夫そう。
次はControllerでの変更点。
ビビるのはBindingHelperExtensionsが無くなってるとこ。
BindingHelperExtensions.UpdateFromが...。これがないとRequest.Formの値をまとめて取り出せないじゃないか。と、みんな同じようなことを思ったみたいでForum確認してみたらちゃんと答えが。
Controller.UpdateModelを使えと。なるほど。確かに取得できる。Request.Formを指定しなくても良くなってたり、TryUpdateModelを使えば例外も起きないっぽい。
さらに今まで、Executeの前後の処理をController.Executeをoverrideしてそこに実装してたけど、これがなんとinternalになって、overrideできなくなりました。
が、しかし、これはちゃんとRelease Noteに書いてるから、すんなりとExecuteCoreのoverrideへ切り替え。でも、Initializeのoverrideでいいような処理だから、こっちにしよ。
ActionFilterAttributeもなんか結構変わってて。
ActionMethod.Name何処にいったんですかね。リフレクションでどうのこうのって書いてるけど、RouteDataから引っ張ってくればいいんですかね?
とりあえずはfilterContext.RouteData.Values["action"]でAction名はとれる。
Cancelもなくなってるし、アクションが実行されなかったかどうかはどこでセットすればいいんですかね?
どうしよ的な変更箇所が多かったりする中で、RenderPartialヘルパーが実装されてたり、AcceptVerbでRESTfulっぽくアクションを書けたり(PUT/DELETEはどうすんの?_methodで書き換えれるのがいいんだけど.NET Reflectorで確認した限りではHttpMethodをそのまま判定に使ってるっぽいから、自分で書いたRESTfulAttributeクラスからの乗り換えはないかな)、AjaxHelperがSystem.Web.Mvc.Ajaxに移動してたり、よさげなこともあるから(他にも FileResultクラスがあったり)しっかりチェックしていこうと思うところです。
How to use the ASP.NET MVC ModelBinder - Melvyn Harbour
↑ModelBinderの使い方サンプル。
Maarten Balliauw {blog} - Form validation with ASP.NET MVC preview 5
↑ModelStateを使った入力検証のサンプル。
これViewDataに入れたりして、エラー項目を保持するのを自分で実装しなきゃいけなかったりしてたけど、超いい感じ!