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にともない作りこまれているので、興味がある方はぜひソースを確認してください。




