SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ASP.NET 3.5 Extensions + ASP.NET MVCフレームワーク

もう一つのASP.NET 「ASP.NET MVC」を知る(後編)

ASP.NET 3.5 Extensions + ASP.NET MVCフレームワーク(2)


  • X ポスト
  • このエントリーをはてなブックマークに追加

フィルタ機能~その2

Output Cacheフィルタ

 OutputCacheフィルタは、ASP.NET MVC上でASP.NETのアウトプットキャッシュ機能を利用ためのフィルタです。通常のASP.NETと違い、OutputCacheフィルタのパラメタとして、DurationCacheProfileなどの設定を行うことになります(現在はSqlDependencyShared属性以外利用可能)。

OutputCacheフィルタの設定例(HomeControllerクラスの一部)
[OutputCache(Duration=5, NoStore=false)]
public string WhatTime()
{
    return DateTime.Now.ToString();

}

HandleErrorフィルタ

 ASP.NET 1.Xの時から、既定のエラー画面が表示されてもユーザーは何が起こっているのかよく理解ができません。HandleErrorフィルタは、開発者だけでなく、ページを利用するユーザーすべてに、エラーが発生していることを分かりやすく表示させます(図11)。

図11 HandleErrorフィルタ適用後のエラー画面
図11 HandleErrorフィルタ適用後のエラー画面

 HandleErrorフィルタは、すべての例外に対しプロジェクト作成時に作成される「\Views\Shared」フォルダに格納されている「Error.aspx」を介してエラーを表示します。

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フィルタの設定例(HomeControllerクラスの一部)
[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を設定します。上記のように設定している場合、SqlExceptionHttpExceptionは専用のページを表示し、そ他の例外は既定のエラーページが表示されます。HandleErrorフィルタは最初に書かれたものの方が優先的に処理されるので、全般対応となるHandleErrorは最後に書きましょう。

Authorizeフィルタ

 Preview 4で実装された認証機能ですが、「web.config」による記述ではなく、Authorizeフィルタを利用することで簡単に設定できます。

 Authorizeフィルタは、設定するだけで認証していないユーザーに要求ページを表示する代わりに、ログインページへリダイレクトします。ログインユーザーには、要求ページを表示します。

 Authorizeフィルタのパラメタとして、特定ユーザーだけアクセスを許可するUsers属性とRole属性の設定を行うことになります(RoleはASP.NETのMembershipで使用するRoleを設定)。

Authorizeフィルタの設定例
// 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());
}

次のページ
ASP.NET MVCにおけるAJAX対応

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
ASP.NET 3.5 Extensions + ASP.NET MVCフレームワーク連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト ナオキ(ナオキ)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2888 2008/09/01 18:49

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング