Asp.net-core-routing

提供:Dev Guides
移動先:案内検索

ASP.NET Core-ルーティング

MVCフレームワークには、3つのコンポーネントがあり、それぞれがジョブの特定の部分に焦点を当てています。 これらすべてが機能するためには、これらのHTTPリクエストを適切なコントローラーに送信する方法を見つける必要があります。 ASP.NET Core MVCでは、このプロセスはルーティングと呼ばれます。 ルーティングは、HTTP要求をコントローラーに送信するプロセスです。

ここで、要求をさまざまなコントローラーにルーティングする方法を理解しましょう。

  • ASP.NET Coreミドルウェアには、特定のHTTP要求を処理のためにコントローラーに送信するかどうかを決定する方法が必要です。
  • MVCミドルウェアは、提供するURLといくつかの構成情報に基づいてこの決定を行います。 この章では、この構成情報を定義するか、MVCミドルウェアを追加するときにStartup.cs内でルーティング情報を言うことができます。
  • このアプローチは、多くの場合、規則ベースのルーティングと呼ばれます。 以下は、従来のルーティングのコードスニペットです。
routeBuilder.MapRoute("Default", "{controller=Home}/{action=Index}/{id?}");
  • このアプローチでは、コントローラーがC#クラスであり、アクションがそのクラスのパブリックメソッドである場合、URLを見てコントローラー名とアクション名を見つける方法をMVCに伝えるテンプレートを定義します。

前の章では、アプリケーションにコントローラー(HomeController)を作成しました。これは、C#クラスであり、基本クラスから派生したり、インターフェースを実装したり、特別な属性を持つ必要はありません。 これは、HomeControllerという名前のプレーンなC#クラスであり、文字列を返すIndexメソッドが含まれています。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace FirstAppdemo.Controllers {
   public class HomeController {
      public string Index() {
         return "Hello, World! this message is from Home Controller...";
      }
   }
}

ここでは、*コントローラーへのルーティング*に焦点を当てます。 また、ルーティングの仕組みを理解してみます。

ここで、アプリケーションにMVCミドルウェアを設定した* Startupクラス*に戻りましょう。 Configureメソッド内で、 UseMvcWithDefaultRoute メソッドを使用しました。

public void Configure(IApplicationBuilder app) {
   app.UseIISPlatformHandler();

   app.UseDeveloperExceptionPage();
   app.UseRuntimeInfoPage();

   app.UseFileServer();
   app.UseMvcWithDefaultRoute();

   app.Run(async (context) => {
      var msg = Configuration["message"];
      await context.Response.WriteAsync(msg);
   });
}

これにより、 HomeController にアクセスできるデフォルトのルーティングルールが得られます。 UseMvcWithDefaultRoute を使用する代わりに、 UseMvc を使用してから、名前付きメソッド ConfigureRoute を使用してこの時点でルートを構成します。 以下は、Startup.csファイルの実装です。

using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Hosting;
using Microsoft.AspNet.Http;

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;
using Microsoft.AspNet.Routing;
using System;

namespace FirstAppDemo {
   public class Startup {
      public Startup() {
         var builder = new ConfigurationBuilder() .AddJsonFile("AppSettings.json");
         Configuration = builder.Build();
      }
      public IConfiguration Configuration { get; set; }

     //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 http://go.microsoft.com/fwlink/?LinkID=398940
      public void ConfigureServices(IServiceCollection services) {
         services.AddMvc();
      }

     //This method gets called by the runtime.
     //Use this method to configure the HTTP request pipeline.
      public void Configure(IApplicationBuilder app) {
         app.UseIISPlatformHandler();

         app.UseDeveloperExceptionPage();
         app.UseRuntimeInfoPage();

         app.UseFileServer();
         app.UseMvc(ConfigureRoute);

         app.Run(async (context) => {
            var msg = Configuration["message"];
            await context.Response.WriteAsync(msg);
         });
      }
      private void ConfigureRoute(IRouteBuilder routeBuilder) {
        //Home/Index
         routeBuilder.MapRoute("Default", "{controller = Home}/{action = Index}/{id?}");
      }

     //Entry point for the application.
      public static void Main(string[] args) => WebApplication.Run<Startup>(args);
   }
}
*ConfigureRoute* メソッド内で、ルートを構成できます。このメソッドはIRouteBuilder型のパラメーターを取得する必要があることがわかります。 ルーティングの目標は、HTTP要求を処理し、その要求に応答できるコントローラーを見つけるためにASP.NET Core MVCが使用するルールを記述することです。
  • 要求を異なるコントローラーにマップできる1つのルートを作成できます。
  • routeBuilderに、新しいルートをマップし、その名前が「Default」であることを伝えてから、最も重要なルーティング情報であるテンプレートを提供できます。
  • テンプレートは文字列であり、ASP.NET Core MVCにURLを分解する方法を説明します。
  • 最後の例では、HomeControllerを追加しているため、次のURLのいずれかを要求することもできます。これらのURLは、HomeControllerのIndexアクションにも送信されます。
  • http://localhost:49940
  • http://localhost:49940/Home
  • http://localhost:49940/Home/Index
  • ブラウザが http://mysite/またはhttp://mysite/Home をリクエストすると、HomeControllerのIndexメソッドから出力が返されます。
  • ブラウザでURLを変更して、これを試すこともできます。 この例では、ポートが異なる場合があることを除いて、* http://localhost:49940/、*です。 */Homeまたは/Home/IndexをURLに追加してEnterボタンを押すと、同じ結果が表示されます。
  • IDの最後の疑問符は、このパラメーターがオプションであることを意味します。 言い換えれば、ASP.NET Core MVCは、ここで何らかのIDを確認する必要はありません。IDは、数字、文字列、またはGUIDです。

ブラウザでアプリケーションを実行してみましょう。 アプリケーションが実行されると、次の出力が表示されます。

出力

app.Runミドルウェアからポップアップメッセージが表示されますが、このメッセージが表示されるのは、MVCミドルウェアがそのURLを認識したためです。 これはWebサイトのルートへのリクエストでしたが、URLにコントローラー名またはアクション名が見つかりませんでした。 Webサイトのルートはそのリクエストの処理を断念し、そのリクエストを次のミドルウェア( app.Run コード)に渡しました。 指定したルートのテンプレートは、デフォルトのテンプレートとは異なり静かです。

デフォルトのテンプレートには、コントローラーとアクション名が見つからない場合に適用するデフォルト値がいくつかあります。 Webサイトのルートにリクエストが届いた場合、デフォルトのコントローラー名はHomeになります。 必要に応じて他のコントローラーに変更することができ、デフォルトのアクション名はインデックスにすることができます。 次のプログラムに示すように、必要に応じてデフォルトのアクションを変更することもできます。

private void ConfigureRoute(IRouteBuilder routeBuilder) {
  //Home/Index
   routeBuilder.MapRoute("Default", "{controller = Home}/{action = Index}/{id?}");
}

Webサイトのルートにリクエストが届いた場合、MVCはコントローラー/アクションタイプのURLを認識しませんが、これらのデフォルトを使用できます。

Startup.csファイルを保存し、ブラウザーをWebサイトのルートに更新します。

ウェブサイトのルート

これで、コントローラーからの応答が表示され、/homeに移動して、デフォルトのアクションであるインデックスを呼び出すこともできます。/home/indexに移動しても、MVCはURLからコントローラー名とアクション名を引き出します。

別のクラスを追加して別のコントローラーを作成し、それを AboutController と呼びましょう。

コントローラについて

次のプログラムに示すように、文字列を返す簡単なアクションメソッドをいくつか追加しましょう。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace FirstAppDemo.Controllers  {
   public class AboutController {
      public string Phone() {
         return "+49-333-3333333";
      }
      public string Country() {
         return "Germany";
      }
   }
}

このコントローラでは、電話と国の2つのアクションメソッドを確認できます。これらはそれぞれ、電話番号と国名のみを返します。 後ほど、洗練されたHTMLについて説明します。 このファイルを保存し、ルートURLの最後に/about/phoneを指定してみましょう。

2つのアクションメソッド

上記のスクリーンショットのように電話番号を見ることができます。 /about/country を指定すると、国の名前も表示されます。

国名

*/about* に移動すると、再びミドルウェアを通過してapp..middlewareに移動し、次のページが表示されます。

About

ここで、ASP.NET Core MVCはAboutControllerに移動しますが、指定されたアクションは見つかりません。 したがって、デフォルトでIndexになり、このコントローラーにはIndexメソッドがありません。その後、リクエストは次のミドルウェアに送られます。