SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

ASP.NET MVC 2入門

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

ASP.NET MVC 2入門(前編)

エリア(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パラメタが必要なため、埋める必要があるというだけです)。

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

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

次のページ
コードナゲット

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

ASP.NET MVC 2入門連載記事一覧

もっと読む

この記事の著者

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、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本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

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

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

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

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5252 2010/07/08 14:00

イベント

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

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

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

メールバックナンバー