次の方法で共有


モデル、ビュー、コントローラーを理解する (C#)

作成者: Stephen Walther

モデル、ビュー、コントローラーについて混乱していますか? このチュートリアルでは、Stephen Walther が、ASP.NET MVC アプリケーションのさまざまな部分について説明します。

このチュートリアルでは、ASP.NET MVC モデル、ビュー、コントローラーの概要について説明します。 言い換えると、ASP.NET MVC の M、V、C' について説明します。

このチュートリアルを読んだ後は、ASP.NET MVC アプリケーションのさまざまな部分がどのように連携するかを理解できます。 また、ASP.NET MVC アプリケーションのアーキテクチャと、ASP.NET Web Forms アプリケーションまたは Active Server Pages アプリケーションのアーキテクチャの違いについても理解する必要があります。

ASP.NET MVC アプリケーションのサンプル

ASP.NET MVC Web アプリケーションを作成するための既定の Visual Studio テンプレートには、ASP.NET MVC アプリケーションのさまざまな部分を理解するために使用できる非常に単純なサンプル アプリケーションが含まれています。 このチュートリアルでは、この単純なアプリケーションを利用します。

VISUAL Studio 2008 を起動し、メニュー オプションの [ファイル]、[新しいプロジェクト] を選択して、MVC テンプレートを使用して新しい ASP.NET MVC アプリケーションを作成します (図 1 を参照)。 [新しいプロジェクト] ダイアログで、[プロジェクトの種類] のプログラミング言語 (Visual Basic または C#) を選択し、[テンプレート] の [ASP.NET MVC Web アプリケーション] を選択 します。 [OK] をクリックします。

New Project Dialog

図 01: [新しいプロジェクト] ダイアログ (クリックすると、フルサイズの画像が表示されます)

新しい ASP.NET MVC アプリケーションを作成すると、[単体テスト プロジェクトの作成] ダイアログが表示されます (図 2 を参照)。 このダイアログでは、ASP.NET MVC アプリケーションをテストするための別のプロジェクトをソリューションに作成できます。 [いいえ、単体テスト プロジェクトを作成しない] のオプションを選択し、[OK ] ボタンをクリックします。

Create Unit Test Dialog

図 02: [単体テストの作成] ダイアログ (クリックすると、フルサイズの画像が表示されます)

新しい ASP.NET MVC アプリケーションが作成された後。 ソリューション エクスプローラー ウィンドウには、いくつかのフォルダーとファイルが表示されます。 特に、Models、Views、Controllers という名前の 3 つのフォルダーが表示されます。 フォルダー名から推測したように、これらのフォルダーには、モデル、ビュー、コントローラーを実装するためのファイルが含まれています。

[Controllers] フォルダーを展開すると、AccountController.cs という名前のファイルと HomeController.cs という名前のファイルが表示されます。 [Views] フォルダーを展開すると、Account、Home、Shared という名前の 3 つのサブフォルダーが表示されます。 [Home] フォルダーを展開すると、About.aspx と Index.aspx という名前の 2 つの追加ファイルが表示されます (図 3 を参照)。 これらのファイルは、既定の ASP.NET MVC テンプレートに含まれるサンプル アプリケーションを構成します。

The Solution Explorer Window

図 03: ソリューション エクスプローラー ウィンドウ (クリックすると、フルサイズの画像が表示されます)

サンプル アプリケーションは、メニュー オプションを [デバッグ]、[デバッグの開始] の順に選択して実行できます。 または、F5 キーを押します。

ASP.NET アプリケーションを初めて実行すると、デバッグ モードを有効にすることを勧める図 4 のダイアログが表示されます。 [OK] ボタンをクリックすると、アプリケーションが実行されます。

Debugging Not Enabled dialog

図 04: [デバッグが有効になっていません] ダイアログ (クリックすると、フルサイズの画像が表示されます)

ASP.NET MVC アプリケーションを実行すると、Visual Studio によって Web ブラウザーでアプリケーションが起動されます。 サンプル アプリケーションは、[インデックス] ページと [バージョン情報] ページの 2 つのページのみで構成されています。 アプリケーションが最初に起動すると、[インデックス] ページが表示されます (図 5 を参照)。 [バージョン情報] ページに移動するには、アプリケーションの右上にあるメニュー リンクをクリックします。

The Index Page

図 05: [インデックス] ページ (クリックすると、フルサイズの画像が表示されます)

ブラウザーのアドレス バーの URL に注目してください。 たとえば、[バージョン情報] メニュー リンクをクリックすると、ブラウザーのアドレス バーの URL が /Home/About に変わります。

ブラウザー ウィンドウを閉じて Visual Studio に戻ると、/Home/About のパスを持つファイルは見つかりません。 そのファイルは存在しません。 どうすればよいでしょうか。

URL はページと同じではない

従来の ASP.NET Web Forms アプリケーションまたは Active Server Pages アプリケーションを構築する場合、URL とページの間には 1 対 1 の対応があります。 サーバーに SomePage.aspx という名前のページを要求する場合は、SomePage.aspx という名前のページがディスク上に存在しているべきです。 SomePage.aspx ファイルが存在しない場合は、「404 - ページが見つかりません 」というエラーが表示されます。

これに対して、ASP.NET MVC アプリケーションをビルドする場合、ブラウザーのアドレス バーに入力した URL と、アプリケーションで見つけたファイルとの間に対応はありません。 ASP.NET MVC アプリケーションでは、URL はディスク上のページではなくコントローラー アクションに対応します。

従来の ASP.NET または ASP アプリケーションでは、ブラウザー要求はページにマップされます。 これに対し、ASP.NET MVC アプリケーションでは、ブラウザー要求はコントローラー アクションにマップされます。 ASP.NET Web Forms アプリケーションはコンテンツ中心です。 一方、ASP.NET MVC アプリケーションは、アプリケーション ロジック中心です。

ASP.NET ルーティングについて

ブラウザー要求は、"ASP.NET ルーティング" と呼ばれる ASP.NET フレームワークの機能を介してコントローラー アクションにマップされます。 ASP.NET ルーティングは、ASP.NET MVC フレームワークによって、着信要求をコントローラー アクションに "ルーティング" するために使用されます。

ASP.NET ルーティングでは、ルート テーブルを使用して受信要求を処理します。 このルート テーブルは、Web アプリケーションの初回起動時に作成されます。 ルート テーブルは Global.asax ファイルで設定されます。 既定の MVC Global.asax ファイルは、リスト 1 に含まれています。

リスト 1 - Global.asax

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit https://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default",                                              // Route name
                "{controller}/{action}/{id}",                           // URL with parameters
                new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
            );

        }

        protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

ASP.NET アプリケーションが最初に起動すると、Application_Start() メソッドが呼び出されます。 リスト 1 では、このメソッドは RegisterRoutes() メソッドを呼び出し、RegisterRoutes() メソッドは既定のルート テーブルを作成します。

既定のルート テーブルは、1 つのルートで構成されます。 この既定のルートは、すべての受信要求を 3 つのセグメントに分割します (URL セグメントはスラッシュに挟まれた任意の部分です)。 最初のセグメントはコントローラー名にマップされ、2 番目のセグメントはアクション名にマップされ、最後のセグメントは、アクションに渡される Id という名前のパラメーターへマップされます。

たとえば、次のような URL があるとします。

/Product/Details/3

この URL は、次の 3 つのパラメーターに解析されます。

コントローラー = Product

アクション = Details

Id = 3

Global.asax ファイルで定義されている既定のルートには、3 つのパラメーターすべてに既定値が含まれています。 既定のコントローラーは Home、既定のアクションは Index、既定の Id は空の文字列です。 これらの既定値を念頭に置いて、次の URL の解析方法を検討してください。

/Employee

この URL は、次の 3 つのパラメーターに解析されます。

コントローラー = Employee

アクション = Index

ID =

最後に、URL (たとえば http://localhost) を指定せずに ASP.NET MVC アプリケーションを開くと、URL は次のように解析されます。

コントローラー = Home

アクション = Index

ID =

要求は、HomeController クラスの Index() アクションにルーティングされます。

コントローラーについて

コントローラーは、ユーザーが MVC アプリケーションと対話する方法を制御する役割を担います。 コントローラーには、ASP.NET MVC アプリケーションのフロー制御ロジックが含まれています。 コントローラーは、ユーザーがブラウザー要求を行ったときにユーザーに返信する応答を決定します。

コントローラーは単なるクラス (Visual Basic クラスや C# クラスなど) です。 ASP.NET MVC アプリケーションのサンプルには、Controllers フォルダーにある HomeController.cs という名前のコントローラーが含まれています。 HomeController.cs ファイルの内容は、リスト 2 で再現されます。

リスト 2 - HomeController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewData["Title"] = "Home Page";
            ViewData["Message"] = "Welcome to ASP.NET MVC!";

            return View();
        }

        public ActionResult About()
        {
            ViewData["Title"] = "About Page";

            return View();
        }
    }
}

HomeController には Index() と About() という名前の 2 つのメソッドがあることに注意してください。 これら 2 つのメソッドは、コントローラーによって公開される 2 つのアクションに対応します。 URL /Home/Index は HomeController.Index() メソッドを呼び出し、URL /Home/About は HomeController.About() メソッドを呼び出します。

コントローラー内のすべてのパブリック メソッドは、コントローラー アクションとして公開されます。 これには注意する必要があります。 つまり、ブラウザーに適切な URL を入力することで、インターネットにアクセスできるすべてのユーザーがコントローラーに含まれるパブリック メソッドを呼び出すことができます。

ビューについて

HomeController クラス Index() と About() によって公開される 2 つのコントローラー アクションは、どちらもビューを返します。 ビューには、HTML マークアップとブラウザーに送信されるコンテンツが含まれています。 ビューは、ASP.NET MVC アプリケーションを操作する場合のページと同等です。

適切な場所にビューを作成する必要があります。 HomeController.Index() アクションは、次のパスにあるビューを返します。

\Views\Home\Index.aspx

HomeController.About() アクションは、次のパスにあるビューを返します。

\Views\Home\About.aspx

一般に、コントローラー アクションのビューを返す場合は、コントローラーと同じ名前のサブフォルダーを Views フォルダーに作成する必要があります。 サブフォルダー内に、コントローラー アクションと同じ名前の.aspx ファイルを作成する必要があります。

リスト 3 のファイルには、About.aspx ビューが含まれています。

リスト 3 - About.aspx

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

<asp:Content ID="aboutContent" ContentPlaceHolderID="MainContent" runat="server">
    <h2>About</h2>
    <p>
        Put content here.
    </p>
</asp:Content>

リスト 3 の最初の行を無視すると、ビューの残りのほとんどの部分は標準の HTML で構成されます。 ここに必要な HTML を入力して、ビューの内容を変更できます。

ビューは、Active Server のページまたは ASP.NET Web Forms のページによく似ています。 ビューには、HTML コンテンツとスクリプトを含めることができます。 スクリプトは、お気に入りの .NET プログラミング言語 (C# や Visual Basic .NET など) で記述できます。 スクリプトを使用して、データベース データなどの動的コンテンツを表示します。

モデルについて

コントローラーについて説明し、ビューについて説明しました。 最後に説明する必要があるトピックはモデルです。 MVC モデルとは

MVC モデルには、ビューまたはコントローラーに含まれていないすべてのアプリケーション ロジックが含まれています。 モデルには、すべてのアプリケーション ビジネス ロジック、検証ロジック、およびデータベース アクセス ロジックが含まれている必要があります。 たとえば、Microsoft Entity Framework を使用してデータベースにアクセスする場合は、Models フォルダーに Entity Framework クラス (.edmx ファイル) を作成します。

ビューには、ユーザー インターフェイスの生成に関連するロジックのみが含まれている必要があります。 コントローラーには、適切なビューを返すか、ユーザーを別のアクション (フロー制御) にリダイレクトするために必要な最小限のロジックのみを含める必要があります。 それ以外はすべてモデルに含める必要があります。

一般に、モデルがより大きくコントローラがより小さくなるように努力する必要があります。 コントローラー メソッドには、数行のコードのみを含めるようにします。 コントローラー アクションが大きくなりすぎる場合は、Models フォルダー内の新しいクラスにロジックを移動することを検討する必要があります。

まとめ

このチュートリアルでは、ASP.NET MVC Web アプリケーションのさまざまな部分の概要を説明しました。 ルーティング ASP.NET、着信ブラウザー要求を特定のコントローラー アクションにマップする方法について説明しました。 コントローラーがブラウザーにビューを返す方法を調整する方法について学習しました。 最後に、モデルにアプリケーション ビジネス、検証、データベース アクセス ロジックがどのように含まれているかを学習しました。