ModelのデータとViewDataの利用方法
ASP.NET MVCはポストバックとViewStateから、ルーティングによるURLマッピングが行えるようになりました。どんなHTTPリクエストもControllerクラスを経由してからViewPageのレンダリングを行います。それではどのようにしてデータを渡すのでしょうか? ここでは、Modelのデータの取り扱いと、ViewDataについて解説します。
Modelのデータの特徴
ASP.NET MVCでは、ModelのデータをController・View側で簡単に取得できます。
まずは、Controller側です。
public ActionResult Index() { // publishersテーブルすべてを取得するLINQ pubsEntities pubs= new pubsEntities(); var publish = from p in pubs.publishers select p; // ViewはパラメタにModelを渡すことができる // Index.aspxページに、上記のLINQ結果をパラメタとしてルーティング return View(publish); }
publishはModelのレコードですが、Viewメソッドのパラメタとして指定すると、Viewへデータを渡します。
続いて、View側の設定です。View側では、ViewPageに対してModelを型付けします。
型付けとは、Modelsフォルダ内に配置したEDMXなどのデータの型をViewPage上で参照追加するという意味です。ViewPageのページ ディレクティブ内では次のように追記されています。
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<SampleMVC.Models.publishers>" %> <中略> <% foreach (var item in Model) { %> <tr> <td> <%= Html.ActionLink("Edit", "Edit", new { id=item.pub_id }) %> | <%= Html.ActionLink("Details", "Details", new { id=item.pub_id })%> </td> <td> <%= Html.Encode(item.city) %> </td> <td> <%= Html.Encode(item.country) %> </td> <td> <%= Html.Encode(item.pub_id) %> </td> <td> <%= Html.Encode(item.pub_name) %> </td> <td> <%= Html.Encode(item.state) %> </td> </tr> <% } %>
ViewPage上で利用するModelの型が何かをViewPage<TModel>の形式で設定します。型付けされた型はModel.XXXX(プロパティ名)という形式でデータの取得ができるようになります(ただし、どのレコードのデータを表示するかはController側で処理を記述する必要がある)。型付けする一番のメリットはViewPage上でインテリセンスを活用したコーディングができることでしょう。HTMLやCSSを組み合わせてページを作成して行く過程で、Modelに対してインテリセンスが活用できると、タイプミスを減らせるのはもちろん、開発の効率も上がります。
ViewDataの特徴
ViewDataは、ASP.NET MVCで利用される「Model以外のデータをControllerからViewへ渡したい時」に利用します。ViewDataはDictionary型で、基本的な利用方法はDictionary
クラスと変わりません。、キーとデータを同時に指定することで、データを格納します。このViewDataを利用してControllerクラスからViewPageへ渡すデータを紐付けることができます。
public ActionResult Hello() { // ViewDataにキーと値を格納 ViewData["Hello"] = "Hello, MVC Framework!"; //ControllerクラスのViewメソッドで、 // ルーティング先のViewPage名を設定する // この場合はPublisher.aspxページ return View("Publisher"); }
コメントでも記述していますが、Viewメソッドは第一パラメタにModelの他に、ルーティング先のViewPage名を設定することもできます。もし、どちらも設定したい場合は「return View("ViewPage名",Model名);」と設定します。
View側では次のように記述し、値を取りだします。
<%= Html.Encode(ViewData["Hello"]) %>
ViewDataはアクセント的な機能です。必要な場合に活用しましょう。
認証機能
ASP.NET MVCでは従来のASP.NETのMembership機能などが利用できます。Membership機能を利用した「AccountController
クラス」というControllerクラスと、その表示を行うViewPageがAccountフォルダ(Viewsフォルダ内)です。これにより、開発者はプロジェクトを起動するだけで、認証機能を利用できます(図3~6)。
このままでも利用できてしまいますが、どのように認証が実装されているのかLogOn
メソッド部分をかいつまんで解説します(メソッドが細分化されているので大まかな流れのみ)。
using System; using System.Globalization; using System.Security.Principal; using System.Web.Mvc; using System.Web.Security; namespace プロジェクト名.Controllers { [HandleError] public class AccountController : Controller { <中略> // アプリ名.Controllers.IFormsAuthenticationインターフェイス // の設定 public IFormsAuthentication FormsAuth { get; private set; } // System.Web.Security.MembershipProviderの設定 public MembershipProvider Provider { get; private set; } <中略> //AcceptVerbs属性によって、LogOnメソッドはHttpリクエストがPostの場合に実行される [AcceptVerbs(HttpVerbs.Post)] public ActionResult LogOn(string userName, string password, bool rememberMe, string returnUrl) { // 入力検証と、ログイン認証を行う if (!ValidateLogOn(userName, password)) { return View(); } // 認証成功時に認証チケットを発行 FormsAuth.SignIn(userName, rememberMe); // returnUrlが指定の有無確認後認証ページからリダイレクト if (!String.IsNullOrEmpty(returnUrl)) { return Redirect(returnUrl); } else { return RedirectToAction("Index", "Home"); } }
ValidateLogOn
メソッドはユーザー名、パスワードがnullかどうかを判定後、そのユーザー名とパスワードが登録されているかどうかをMenbershipプロバイダ経由でチェックします。認証成功時には、SignIn
メソッドが認証ユーザーに認証チケットを作成、CookieかURL(Cookieを利用していない場合に利用)に追加します。その後、LogOn
メソッドのパラメタ「returnUrl」が指定されている場合は、そのページに、指定されていない場合は、/Home/Indexへとリダイレクトされます。
ユーザー登録やパスワード変更、ログアウトに関しても同様にMembership機能を利用して実装しています。認証部分はRTWにともない作りこまれているので、興味がある方はぜひソースを確認してください。