フィルタ機能~その2
Output Cacheフィルタ
OutputCache
フィルタは、ASP.NET MVC上でASP.NETのアウトプットキャッシュ機能を利用ためのフィルタです。通常のASP.NETと違い、OutputCache
フィルタのパラメタとして、Duration
やCacheProfile
などの設定を行うことになります(現在はSqlDependency
・Shared
属性以外利用可能)。
[OutputCache(Duration=5, NoStore=false)] public string WhatTime() { return DateTime.Now.ToString(); }
HandleErrorフィルタ
ASP.NET 1.Xの時から、既定のエラー画面が表示されてもユーザーは何が起こっているのかよく理解ができません。HandleError
フィルタは、開発者だけでなく、ページを利用するユーザーすべてに、エラーが発生していることを分かりやすく表示させます(図11)。
HandleError
フィルタは、すべての例外に対しプロジェクト作成時に作成される「\Views\Shared」フォルダに格納されている「Error.aspx」を介してエラーを表示します。
Error.aspxの中身は?
さて、ここで気になるのは「Error.aspx」ファイルの中身だと思います。どのように例外情報を取得しているのか見てみましょう。
<%--現在のViewContext(HttpContext)
エラーに対してカスタムエラーが有効かどうか--%>
<% if (!ViewContext.HttpContext.IsCustomErrorEnabled) { %>
<h3>
Exception details:
</h3>
<div style="overflow: auto;">
<%--Exceptionのコレクションを用意--%>
<%
Stack<Exception> exceptions = new Stack<Exception>();
//Exceptionコレクションの中に、例外を発生させた
//インスタンスをすべてPush追加
for (Exception ex = ViewData.Model.Exception;
ex != null; ex = ex.InnerException)
{
exceptions.Push(ex);
}
//ExceptionコレクションをDiv
タグを使って表示
foreach (Exception ex in exceptions) {
%>
<div>
<%--例外のフルネームとメッセージがあれば、
メッセージの表示--%>
<b><%= Html.Encode(ex.GetType().FullName)%>
</b>: <%= Html.Encode(ex.Message)%>
</div>
<div>
<%--例外のスタックトレースを表示--%>
<pre style="font-size: medium;">
<%= Html.Encode(ex.StackTrace)%></pre>
</div>
<%
}
%>
</div>
<% } %>
この場合、エラーにより表示したいページを切り替えたいときは、HandleError
フィルタのパラメタを次のように設定します。
[HandleError(ExceptionType = typeof(NullReferenceException), View = "NullError")] [HandleError(ExceptionType = typeof(HttpException), View = "HttpError")] [HandleError] public class HomeController : Controller { public object NullEx() { throw new NullReferenceException(); } public object HttpEx() { throw new HttpException(); }
ExceptionType
プロパティに例外の型を、View
プロパティに表示するViewPageを設定します。上記のように設定している場合、SqlException
・HttpException
は専用のページを表示し、そ他の例外は既定のエラーページが表示されます。HandleError
フィルタは最初に書かれたものの方が優先的に処理されるので、全般対応となるHandleErrorは最後に書きましょう。
Authorizeフィルタ
Preview 4で実装された認証機能ですが、「web.config」による記述ではなく、Authorize
フィルタを利用することで簡単に設定できます。
Authorize
フィルタは、設定するだけで認証していないユーザーに要求ページを表示する代わりに、ログインページへリダイレクトします。ログインユーザーには、要求ページを表示します。
Authorize
フィルタのパラメタとして、特定ユーザーだけアクセスを許可するUsers
属性とRole
属性の設定を行うことになります(Role
はASP.NETのMembershipで使用するRole
を設定)。
// naokiとlibatyがAdmin権限あり //[Authorize(Roles="Admin")] //[Authorize(Users="fujiko,naoki")] [Authorize] public ActionResult title() { PubsDataContext pubsdatacontext = new PubsDataContext(); // titlesテーブルの中からroyaltyが10以上の項目を取得 var pubs = from p in pubsdatacontext.titles where p.royalty > 10 select p; // TitleView.aspxページに上記のLINQ結果を // パラメタとしてルーティング return View("TitleView", pubs.ToList()); }