ASP.NET Core Web アプリケーションでコントローラーへのルーティング、マッピングを作成する - ASP.NET Core

ASP.NET Core Web アプリケーションでコントローラーへのルーティング、マッピングを作成する手順を紹介します。

概要

こちらの記事では、ASP.NET Core Web アプリケーションでルーティングの機能を利用してエンドポイントを作成しました。 この記事では、ASP.NET Coreアプリケーションのルーティングの機能を利用してコントローラーへのルーティングを作成する手順を紹介します。

手順

事前準備

ASP.NET Core Webアプリケーションを作成します。作成手順はこちらの記事を参照してください。

コントローラーのフォルダの作成

はじめにコントローラーのフォルダを作成します。プロジェクトを開きます。ソリューションエクスプローラーでプロジェクトのノードを選択します。


右クリックしてポップアップメニューを表示します。メニューの[追加]の[新しいフォルダ]の項目をクリックします。


プロジェクトのノードの直下にフォルダが作成されます。名称を "Controllers" に設定しまします。この名前は任意の名前でよいです。また、一般的にはコントローラーを格納するフォルダを作成しますがフォルダを作成せずにコントローラーのコードをプロジェクトの直下においても動作します。


フォルダが作成できました。

コントローラーの追加

作成したControllersフォルダにコントローラーを追加します。ソリューション エクスプローラーで先に作成したControllersフォルダをクリックして選択します。
右クリックしてポップアップメニューを表示します。メニューの[追加]の[コントローラー]の項目をクリックします。


[新規スキャフォールディング アイテムの追加]ダイアログが表示されます。


中央の項目の種類の一覧から[API コントローラー - 空]または[MVC コントローラー - 空]をクリックして選択します。下図では、[APIコントローラー - 空]を選択しています。選択後ダイアログ右下の[追加]ボタンをクリックします。


[空の API コントローラー の追加]dダイアログが表示されます。


コントローラーの名前を設定します。今回は[ExampleController]とします。設定ができたら[追加]ボタンをクリックします。


コントローラーが追加できました。


参考

名称をDefaultControllerとした場合の[API コントローラー - 空]と[MVC コントローラー - 空]のコントローラーの雛型のコードを紹介します。
DefaultController.cs (APIコントローラー - 空)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace RoutingController.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class Default1Controller : ControllerBase
    {
    }
}
DefaultController.cs (MVCコントローラー - 空)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;

namespace RoutingController.Controllers
{
    public class DefaultController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
}

コード

下記のコードを記述します。
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

namespace RoutingController
{
  public class Program
  {
    public static void Main(string[] args)
    {
      CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
              webBuilder.UseStartup<Startup>();
            });
  }
}
Startup.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace RoutingController
{
  public class Startup
  {
    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services)
    {
      services.AddControllers();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
      if (env.IsDevelopment()) {
        app.UseDeveloperExceptionPage();
      }

      app.UseRouting();

      app.UseEndpoints(endpoints =>
      {
        endpoints.MapControllerRoute("route1", "{controller}/{action}/{query}");
      });
    }
  }
}
ExampleController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace RoutingController.Controllers
{
    public class ExampleController : ControllerBase
    {
      public ActionResult<string> Main(string query)
      {
        return "Hello ASP.NET Core Controller World! :"+query;
      }
    }
}

解説

Program.csはプロジェクト作成状態から変更はありません。
Startup.csはConfigureServicesメソッドは下記のコードになります。AddControllers() メソッドを呼び出すことでコントローラーを追加して利用できる状態にします。
  public void ConfigureServices(IServiceCollection services)
  {
    services.AddControllers();
  }

コントローラーを追加しない状態で、後述のMapControllerRouteメソッドを呼び出すと、コントローラーが利用できない状態のため、下記のエラーが発生します。
System.InvalidOperationException: 'Unable to find the required services. Please add all the required services by calling 'IServiceCollection.AddControllers' inside the call to 'ConfigureServices(...)' in the application startup code.'

コントローラーへのルーティングを作成するConfigureメソッドは下記のコードになります。UseRouting()メソッドの呼び出しとUseEndpoints()メソッドの呼び出しでルーティングを実装します。ルーティング実装の詳細はこちらの記事を参照してください。
MapControllerRoute() メソッドがコントローラーへのルートマップの追加になります。今回は第二引数のパターンに {controller}/{action}/{query} を与えているため、(アプリケーションルートURL)/(コントローラー名)/(アクション名)/(クエリパラメータ名) の形式のURLに対してコントローラーへのルーティングを実行します。
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
      if (env.IsDevelopment()) {
        app.UseDeveloperExceptionPage();
      }

      app.UseRouting();

      app.UseEndpoints(endpoints =>
      {
        endpoints.MapControllerRoute("route1", "{controller}/{action}/{query}");
      });
    }

コントローラーのコードは下記になります。元の雛型ではAPI属性や属性ルーティングの記述がありますが、Startup.csでルーティングマップを作成するため、属性の記述は外します。Mainメソッドに"Hello API Controller World!"の文字列とqueryパラメーター名を返す処理を実装します。
namespace RoutingController.Controllers
{
    public class ExampleController : ControllerBase
    {
      public ActionResult<string> Main(string query)
      {
        return "Hello ASP.NET Core Controller World! :"+query;
      }
    }
}

実行結果

プロジェクトを実行します。初期状態ではアプリケーションルートのURLが表示されますが、URLがルートマッピングのパターンに一致していない形式のため、404エラーのNot Foundとなります。


続いてアドレスバーに (アプリケーションルートURL)/Example/Main/text のURLを入力してアクセスします。下図のページが表示されます。ルートマッピングのパターンに一致しているURLのためコントローラーへのルーティングができています。"Example"と"Main"の値によりExampleControllerのMainメソッドが呼び出され、"Hello ASP.NET Core Controller World!" の値とURLパラメータの値が表示されることが確認できます。


URLを (アプリケーションルートURL)/Example/Main/penguin に変更します。パターンにマッチした形式のため、コントローラーにルーティングされます。またURLのパラメーターの値も入力した値が画面に表示されることが確認できます。


ASP.NET Core Webアプリケーションでコントローラーへのルーティングを実装できました。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-01-06
作成日: 2019-10-27
iPentec all rights reserverd.