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

作成者 : Rick Anderson

Note

このチュートリアルの更新バージョンは、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 コントローラー空] が選択されています。

新しいコントローラーに "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 により Index 、 クラスの メソッドが HelloWorldController 実行されます。 /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 と一致しました。アクション メソッドには、 メソッドの 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スラッシュ Welcome forward slash Scott スラッシュ 3 のブラウザー ウィンドウを示すスクリーンショット。ウィンドウ内のテキストは Hello Scott ID 3 です。

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

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