エリア(Areas)
MVCアプリケーション内でコントローラーとビューの数が多くなることもあるでしょう。例えば、大規模プロジェクトで、Eコマースサイトの利用者と、コンテンツ提供者(管理者)などで、アプリケーションを区分けできれば保守性を高めることができます。他にも複数チームで開発をする際にも効果的です。
エリア(VS 2010上では区分と記載されています)とは、単一のMVCアプリケーションをいくつかのMVCアプリケーションに分割し、開発生産性、保守性を向上できる機能です(図2)。
エリア使用例
エリアの使用法は簡単です。MVCプロジェクト上のコンテキストメニューで[追加]-[区分]と選択し、表示されるダイアログで分割するMVCアプリケーション名(区分名)を入力し追加ボタンを押すだけです(図3)。ここではサンプルですので、Adminと入力し追加します。
すると、図4のようにAreasフォルダー内にadminフォルダーが作成され、その直下にはControllers/Models/Viewsフォルダーがそれぞれ作成されます。

エリアのポイントとなるファイルとして「エリア名AreaRegistration.cs」があります。このファイルでは、エリア名と、エリア内のルーティングルールを記載します。以下は、エリア作成後のAreaRegistrationファイルです。
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ファイル内でルート登録します。実際に登録されているのは次の部分です。
using System.Web.Mvc;
<中略>
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
}
RegisterAllAreasメソッドはMVCアプリケーション内のエリアすべてのAreaRegistrationファイルで指定されているルーティングをルート登録します。
なお、既定のGlobal.asaxの記述だけでは、ペアレントノード(エリアではなくトップのMVCフォルダー)のアプリケーションと、エリア内のアプリケーションで同一のコントローラー名が使用できません。これは、同一のコントローラ名を識別できないからです。
図5のエラーにもありますが、ルートの名前空間を設定することで解決します。名前空間の設定は次のとおりです。
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("リンクテキスト", "アクション名", "コントローラー名", 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パラメタが必要なため、埋める必要があるというだけです)。
このポイントを押さえておけばエリア間のリンクの作成もできます。
大規模アプリケーション開発/チーム開発などではエリアがおススメです。



