RealPath:
WebPath:
2017/09/02 14:17 (JST) 更新
ルーティング >>

エリア設定

Contents

エリアについて

MVC群を以下のようにエリアという単位でカテゴリ分けすることができます。

Project/
  Areas/
    Area1/
      Controllers/
        HogeController.cs
      Views/
        Hoge/
          Index.cshtml
          About.cshtml
    Area2/
      Controllers/
        FugaController.cs
      Views/
        Fuga/
          Index.cshtml
          About.cshtml
  • モデルクラスはどこに置いても良いです。
  • コントローラクラスもどこに置いても良いですが、エリアに紐づけるのであれば上のような階層が好ましいです。
  • ビューファイルは上のような階層に沿って配置する必要があります。

サンプルプロジェクト

コントローラへのエリア指定

コントローラをフォルダ階層に置くだけではエリア指定はされない。
コントローラのエリアを指定するためには、Area アノテーションを用いる。

[Area("Area1")]
public class HogeController : Controller
{
   ....
}

エリア用のルート設定

Startup.cs
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    ....
    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");

        // ★ここを追加
        routes.MapRoute(
            name: "area-route",
            template: "{area}/{controller=Home}/{action=Index}/{id?}");
    });
}

このようにルート設定しておくと、
http://hostname/Area1/Hoge/Index のような URL で Area1 の Hoge コントローラの Index アクションにアクセスできる。
http://hostname/Area2/Fuga/About のような URL で Area2 の Fuga コントローラの About アクションにアクセスできる。

ドメイン(ホスト名)によるエリア切替

以下のように MapWhen によってリクエスト時のホスト名によりエリア切替を行うこともできる。

Startup.cs
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    ....
    app.MapWhen(
        (HttpContext context) =>
        {
            return context.Request.Host.Value.StartsWith("area1.");
        },
        (IApplicationBuilder builder) =>
        {
            builder.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "area1route",
                    template: "{controller=Home}/{action=Index}/{id?}",
                    defaults: new { area = "Area1" }
                );
            });
        }
    );
    app.MapWhen(
        (HttpContext context) =>
        {
            return context.Request.Host.Value.StartsWith("area2.");
        },
        (IApplicationBuilder builder) =>
        {
            builder.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "area2route",
                    template: "{controller=Home}/{action=Index}/{id?}",
                    defaults: new { area = "Area2" }
                );
            });
        }
    );

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
        routes.MapRoute(
            name: "area-route",
            template: "{area}/{controller=Home}/{action=Index}/{id?}");
    });
}

このようにしておくと、
http://area1.hostname/Hoge/Index という URL で Area1 の Hoge コントローラの Index アクションにアクセスできる。
http://area2.hostname/Fuga/About という URL で Area2 の Fuga コントローラの About アクションにアクセスできる。