CodeZine(コードジン)

特集ページ一覧

ASP.NET MVC 2によるエリアとテンプレート活用

ASP.NET MVC 2入門(前編)

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2010/07/08 14:00
目次

エリア(Areas)

 MVCアプリケーション内でコントローラーとビューの数が多くなることもあるでしょう。例えば、大規模プロジェクトで、Eコマースサイトの利用者と、コンテンツ提供者(管理者)などで、アプリケーションを区分けできれば保守性を高めることができます。他にも複数チームで開発をする際にも効果的です。

 エリア(VS 2010上では区分と記載されています)とは、単一のMVCアプリケーションをいくつかのMVCアプリケーションに分割し、開発生産性、保守性を向上できる機能です(図2)。

図2 エリアイメージ図
図2 エリアイメージ図

エリア使用例

 エリアの使用法は簡単です。MVCプロジェクト上のコンテキストメニューで[追加]-[区分]と選択し、表示されるダイアログで分割するMVCアプリケーション名(区分名)を入力し追加ボタンを押すだけです(図3)。ここではサンプルですので、Adminと入力し追加します。

図3 区分の追加ダイアログ
図3 区分の追加ダイアログ

 すると、図4のようにAreasフォルダー内にadminフォルダーが作成され、その直下にはControllers/Models/Viewsフォルダーがそれぞれ作成されます。

図4 エリアの構造
図4 エリアの構造

 エリアのポイントとなるファイルとして「エリア名AreaRegistration.cs」があります。このファイルでは、エリア名と、エリア内のルーティングルールを記載します。以下は、エリア作成後のAreaRegistrationファイルです。

adminAreaRegistration.csの既定の設定
using System.Web.Mvc;

namespace CodeZineMVC2.Areas.admin
{
    public class adminAreaRegistration : AreaRegistration
    {
        // エリア名の上書き
        public override string AreaName
        {
            get
            {
                return "admin";
            }
        }

        // adminエリア内のルーティングルールの設定
        public override void RegisterArea(AreaRegistrationContext context)
        {
            context.MapRoute(
                "admin_default",
                "admin/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional }
            );
        }
    }
}

 AreaRegistrationクラスは、MVCアプリケーション内で1つ以上のエリアを登録する際に利用するクラスです。そのクラスを継承してダイアログで指定したadminAreaRegistrationクラスを作成しています。また、エリア名を取得するAreaNameプロパティを上書きし、RegisterAreaメソッドで、adminエリア内のルーティングルールを設定しています。ここで、設定したルーティングルールはGlobal.asaxファイル内でルート登録します。実際に登録されているのは次の部分です。

Global.asax.csの一部
using System.Web.Mvc;

<中略>

        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            RegisterRoutes(RouteTable.Routes);
        }

 RegisterAllAreasメソッドはMVCアプリケーション内のエリアすべてのAreaRegistrationファイルで指定されているルーティングをルート登録します。

 なお、既定のGlobal.asaxの記述だけでは、ペアレントノード(エリアではなくトップのMVCフォルダー)のアプリケーションと、エリア内のアプリケーションで同一のコントローラー名が使用できません。これは、同一のコントローラ名を識別できないからです。

図5 コントローラーの識別エラー
図5 コントローラーの識別エラー

 図5のエラーにもありますが、ルートの名前空間を設定することで解決します。名前空間の設定は次のとおりです。

Global.asax.csの一部
public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Default", // ルート名
        "{controller}/{action}/{id}", // パラメーター付きの URL
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // パラメーターの既定値
        null,
        new[] { "CodeZineMVC2.Controllers" } // 名前空間の設定
    );
}

 Global.asax内の既定のルート内に名前空間を明示的に指定することで、Controllerの識別ができるようになります。エリア開発で同一のコントローラー名を指定したい場合はこの方法を利用しましょう。

 以上がエリアのルーティング部分のポイントです。上記は既定のままの設定ですので必要に応じて変更して行くことでより効果的なアプリケーション開発ができるでしょう。

エリア間のリンク

 最後に、エリア間のリンクについて記載します。

 エリア間のリンクでは、エリアのコントローラーファイルを見つけられるかどうかがポイントとなります。

 エリアのビューにルーティングしたい場合、エリアのビューからペアレントノードのビューへルーティングするには次のように記述します。

エリア間のHtml.ActionLinkの設定
<%: Html.ActionLink("リンクテキスト", "アクション名", "コントローラー名", new { area = "エリア名" }, null)%>

<%-- ペアレントノードのビュー → エリアのビューへ --%>
<%: Html.ActionLink("adminエリアのIndex", "Index", "adminHome", new { area = "admin" }, null)%>

<%-- エリアのビュー → ペアレントノードのビューへ --%>
<%: Html.ActionLink("元のIndex", "Index", "Home", new {area=""},null)%>

 第4パラメタに匿名オブジェクトでエリア名を記載し、第5パラメタをnullに設定することでリンクができます。なお、ペアレントノードのリンクはnew {area =""}と記載します。最後にnullを指定するのは、おまじないの様な物です(厳密には匿名オブジェクトのパラメータとして第7パラメタが必要なため、埋める必要があるというだけです)。

 このポイントを押さえておけばエリア間のリンクの作成もできます。

 大規模アプリケーション開発/チーム開発などではエリアがおススメです。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:ASP.NET MVC 2入門

著者プロフィール

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

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XM...

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

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

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5