新しいコントローラーの追加

作成者 : Rick Anderson

注意

このチュートリアルの更新バージョンは、Visual Studio の最新バージョンを使用してこちらで入手できます。 新しいチュートリアルでは、MVC ASP.NET Core使用します。このチュートリアルでは、このチュートリアルに対して多くの機能強化が提供されます。

このチュートリアルでは、ASP.NET Core MVC のコントローラーとビューについて説明します。 Razor Pages は、ASP.NET Coreの新しい代替手段であり、Web UI の構築を容易かつ生産的にするページ ベースのプログラミング モデルです。 MVC バージョンの前に Razor Pages チュートリアルを試してみることをお勧めします。 この Razor ページのチュートリアルの特徴は次のとおりです。

  • 使いやすい。
  • 多くの機能をカバーしている。
  • 新しいアプリ開発に推奨されるアプローチです。

MVC は model-view-controller を表します。 MVC は、適切に設計され、テスト可能で保守が容易なアプリケーションを開発するためのパターンです。 MVC ベースのアプリケーションには、次のものが含まれます。

  • M odels: アプリケーションのデータを表し、検証ロジックを使用してそのデータにビジネス ルールを適用するクラス。
  • V iews: アプリケーションが HTML 応答を動的に生成するために使用するテンプレート ファイル。
  • C ontrollers: 受信したブラウザー要求を処理し、モデル データを取得し、ブラウザーへの応答を返すビュー テンプレートを指定するクラス。

このチュートリアル シリーズでは、これらすべての概念について説明し、それらを使用してアプリケーションを構築する方法について説明します。

まず、コントローラー クラスを作成します。 ソリューション エクスプローラーで、Controllers フォルダーを右クリックし、[追加]、[コントローラー] の順にクリックします。

ソリューション エクスプローラー ウィンドウを示すスクリーンショット。コントローラーの右クリック メニューと [追加] サブメニューが開いています。

[ スキャフォールディングの追加 ] ダイアログ ボックスで、[ MVC 5 コントローラー - 空] をクリックし、[ 追加] をクリックします。

[スキャフォールディングの追加] ダイアログ ボックスを示すスクリーンショット。[M V C 5 Controller Empty]\(M V C 5 コントローラー空\) が選択されています。

新しいコントローラーに "HelloWorldController" という名前を 付け、[追加] をクリックします。

コントローラーの追加

ソリューション エクスプローラーで、HelloWorldController.cs という名前の新しいファイルと、新しいフォルダー Views\HelloWorld が作成されていることに注意してください。 コントローラーは IDE で開いています。

Hello World コントローラーのドット cs タブが開いている様子を示すスクリーンショット。ソリューション エクスプローラーでは、Hello World Controller のドット c s サブフォルダーとHello Worldサブフォルダーは赤で囲まれています。

このファイルの内容を次のコードに置き換えます。

using System.Web;
using System.Web.Mvc; 
 
namespace MvcMovie.Controllers 
{ 
    public class HelloWorldController : Controller 
    { 
        // 
        // GET: /HelloWorld/ 
 
        public string Index() 
        { 
            return "This is my <b>default</b> action..."; 
        } 
 
        // 
        // GET: /HelloWorld/Welcome/ 
 
        public string Welcome() 
        { 
            return "This is the Welcome action method..."; 
        } 
    } 
}

コントローラー メソッドは、例として HTML の文字列を返します。 コントローラーには という名前が付けられ HelloWorldController 、最初のメソッドには という名前が付けられます Index。 ブラウザーから呼び出してみましょう。 アプリケーションを実行します (F5 キーまたは Ctrl + F5 キーを押します)。 ブラウザーで、アドレス バーのパスに "HelloWorld" を追加します。 (たとえば、次の図では です http://localhost:1234/HelloWorld.)。ブラウザーのページは、次のスクリーンショットのようになります。 上記のメソッドでは、コードは文字列を直接返しました。 あなたはシステムにHTMLを返すように言いましたが、それはそうしました!

テキストが表示されたローカル ホスト タブを示すスクリーンショット これは、ウィンドウ内の既定のアクションです。

ASP.NET MVC は、受信 URL に応じて異なるコントローラー クラス (およびその中の異なるアクション メソッド) を呼び出します。 ASP.NET MVC によって使用される既定の URL ルーティング ロジックは、次のような形式を使用して、呼び出すコードを決定します。

/[Controller]/[ActionName]/[Parameters]

ルーティングの形式は 、App_Start/RouteConfig.cs ファイルで設定します。

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

アプリケーションを実行し、URL セグメントを指定しない場合、既定では、上記のコードの defaults セクションで指定された "Home" コントローラーと "Index" アクション メソッドが使用されます。

URL の最初の部分によって、実行するコントローラー クラスが決まります。 そのため 、/HelloWorld は クラスにマップされます HelloWorldController 。 URL の 2 番目の部分は、実行するクラスのアクション メソッドを決定します。 そのため、/HelloWorld/Index により、 クラスの メソッドがHelloWorldController実行されますIndex/HelloWorld を参照するだけで済み、 メソッドがIndex既定で使用されていることに注意してください。 これは、 という名前 Index のメソッドがコントローラーで明示的に指定されていない場合に呼び出される既定のメソッドであるためです。 URL セグメントの 3 番目の部分 (Parameters) はルート データ用です。 ルート データについては、このチュートリアルの後半で説明します。

http://localhost:xxxx/HelloWorld/Welcome を参照します。 Welcome メソッドが実行され、"This is the Welcome action method..." という文字列を返します。 既定の MVC マッピングは です /[Controller]/[ActionName]/[Parameters]。 この URL では、コントローラーは HelloWorld で、Welcome がアクション メソッドです。 URL の [Parameters] の部分はまだ使っていません。

テキストが表示されたローカル ホスト タブを示すスクリーンショット。これは、ウィンドウ内の Welcome アクション メソッドです。

URL からコントローラーにパラメーター情報を渡すことができるように、例を少し変更してみましょう (たとえば、 /HelloWorld/Welcome?name=Scott&numtimes=4)。 次に示すように、メソッドを Welcome 変更して 2 つのパラメーターを含めます。 コードでは、C# optional-parameter 機能を使用して、そのパラメーターに値が numTimes 渡されない場合、パラメーターの既定値が 1 であることを示します。

public string Welcome(string name, int numTimes = 1) {
     return HttpUtility.HtmlEncode("Hello " + name + ", NumTimes is: " + numTimes);
}

Note

セキュリティ上の注意: 上記のコードでは 、HttpUtility.HtmlEncode を使用して、悪意のある入力 (つまり JavaScript) からアプリケーションを保護します。 詳細については、「 方法: 文字列に HTML エンコードを適用して Web アプリケーションのスクリプトの悪用から保護する」を参照してください

アプリケーションを実行し、URL の例 (http://localhost:xxxx/HelloWorld/Welcome?name=Scott&numtimes=4) を参照します。 URL の namenumtimes に違う値を指定してみてください。 ASP.NET MVC モデル バインド システムは、アドレス バーのクエリ文字列からメソッド内のパラメーターに名前付きパラメーターを自動的にマップします。

U R L ローカル ホスト コロン 1 2 3 4 スラッシュを含むブラウザー ウィンドウを示すスクリーンショットHello Worldスラッシュウェルカム疑問符名は Scott、num times は 4 です。ウィンドウ内のテキストは Hello Scott Num Times が 4 です。

上記のサンプルでは、URL セグメント ( Parameters) は使用されず、 name パラメーターと numTimes パラメーターは クエリ文字列として渡されます。 ? 上記の URL の (疑問符) は区切り記号であり、クエリ文字列は後に続きます。 & 文字はクエリ文字列を区切ります。

Welcome メソッドを次のコードに置き換えます。

public string Welcome(string name, int ID = 1)
{
    return HttpUtility.HtmlEncode("Hello " + name + ", ID: " + ID);
}

アプリケーションを実行し、次の URL を入力します。 http://localhost:xxx/HelloWorld/Welcome/1?name=Scott

U R L ローカル ホスト コロン 1 2 3 4 スラッシュ Hello Worldスラッシュウェルカム スラッシュ 1 疑問符名が scott と等しいブラウザー ウィンドウを示すスクリーンショット。ウィンドウ内のテキストは Hello Scott ID 1 です。

今回、3 番目の URL セグメントがルート パラメーター ID.Welcome と一致しました。action メソッドには、 メソッドの URL 仕様に一致するパラメーター (ID) が RegisterRoutes 含まれています。

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

ASP.NET MVC アプリケーションでは、パラメーターをクエリ文字列として渡すよりも、(上記の ID で行ったように) ルート データとしてパラメーターを渡す方が一般的です。 URL のルート データとして パラメーターと numtimes in パラメーターの両方をname渡すルートを追加することもできます。 App_Start\RouteConfig.cs ファイルで、"Hello" ルートを追加します。

public class RouteConfig
{
   public static void RegisterRoutes(RouteCollection routes)
   {
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

      routes.MapRoute(
          name: "Default",
          url: "{controller}/{action}/{id}",
          defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
      );

      routes.MapRoute(
           name: "Hello",
           url: "{controller}/{action}/{name}/{id}"
       );
   }
}

アプリケーションを実行し、 を参照します /localhost:XXX/HelloWorld/Welcome/Scott/3

U R L ローカル ホスト コロン 1 2 3 4 スラッシュ Hello Worldスラッシュウェルカム スラッシュ Scott スラッシュ 3 を含むブラウザー ウィンドウを示すスクリーンショット。ウィンドウ内のテキストは Hello Scott ID 3 です。

多くの MVC アプリケーションでは、既定のルートは正常に動作します。 モデル バインダーを使用してデータを渡すには、このチュートリアルの後半で学習します。そのための既定のルートを変更する必要はありません。

これらの例では、コントローラーは MVC の "VC" 部分 、つまりビューとコントローラーの動作を行っています。 コントローラーは HTML を直接返しています。 通常、HTML を直接返すコントローラーは必要ありません。これは、コーディングが非常に面倒になるためです。 代わりに、通常、HTML 応答の生成に役立つ別のビュー テンプレート ファイルを使用します。 次に、これを行う方法を見てみましょう。