ASP.NET MVC コントローラーの概要 (C#)

投稿者: Stephen Walther

このチュートリアルでは、Stephen Walther が ASP.NET の MVC コントローラーについて説明します。 新しいコントローラーを作成し、さまざまな種類のアクション結果を返す方法をご覧ください。

このチュートリアルでは、ASP.NET MVC コントローラー、コントローラーのアクション、アクションの結果に関するトピックを扱います。 このチュートリアルを完了すると、コントローラーを使用して、訪問者が ASP.NET MVC Web サイトと対話する方法を制御する方法を理解できるようになります。

コントローラーについて

MVC コントローラーは、ASP.NET の MVC Web サイトに対して行われた要求に応答する役割を担います。 各ブラウザー要求は、特定のコントローラーにマップされます。 たとえば、ブラウザーのアドレス バーに次の URL を入力するとします。

http://localhost/Product/Index/3

この場合、ProductController という名前のコントローラーが呼び出されます。 ProductController は、ブラウザー要求への応答を生成する役割を担います。 たとえば、コントローラーからブラウザーに特定のビューが返されたり、コントローラーによってユーザーが別のコントローラーにリダイレクトされたりすることがあります。

リスト 1 には、ProductController という名前の単純なコントローラーが含まれています。

リスト 1 - Controllers\ProductController.cs

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

namespace MvcApplication1.Controllers
{
    public class ProductController : Controller
    {
        //
        // GET: /Products/

        public ActionResult Index()
        {
            // Add action logic here
            return View();
        }
    }
}

リスト 1 からわかるように、コントローラーは単なるクラス (Visual Basic .NET または C# クラス) です。 コントローラーは、System.Web.Mvc.Controller のベース クラスから派生するクラスです。 コントローラーはこのベース クラスから継承されるため、コントローラーは、いくつかの便利なメソッドを無料で継承します (後ほど、これらのメソッドについて説明します)。

コントローラー アクションについて

コントローラーは、コントローラーアクションを公開します。 アクションは、ブラウザーのアドレス バーに特定の URL を入力したときに呼び出されるコントローラーのメソッドです。 たとえば、次の URL に対して要求を行うとします。

http://localhost/Product/Index/3

この場合、Index() メソッドは ProductController クラスに呼び出されます。 Index() メソッドは、コントローラー アクションの例です。

コントローラー アクションは、コントローラー クラスのパブリック メソッドである必要があります。 C# メソッドは、既定ではプライベート メソッドです。 コントローラー クラスに追加するパブリック メソッドはいずれも、コントローラー アクションとして自動的に公開されます (コントローラー アクションは、ブラウザーのアドレス バーに適切な URL を入力するだけで、世界中の誰でも呼び出すことができるため、注意が必要です)。

コントローラー アクションで満たす必要がある追加の要件がいくつかあります。 コントローラー アクションとして使用されるメソッドをオーバーロードすることはできません。 さらに、コントローラー アクションを静的メソッドにすることはできません。 それ以外の場合は、コントローラー アクションとしてあらゆるメソッドを使用できます。

アクションの結果について

コントローラー アクションは、アクション結果と呼ばれるものを返します。 アクション結果とは、コントローラー アクションがブラウザー要求に応答して返すものです。

ASP.NET の MVC フレームワークでは、次のようないくつかの種類のアクション結果がサポートされています。

  1. ViewResult - HTML とマークアップを表します。
  2. EmptyResult - 結果なしを表します。
  3. RedirectResult - 新しい URL へのリダイレクトを表します。
  4. JsonResult - AJAX アプリケーションで使用できる JavaScript Object Notation の結果を表します。
  5. JavaScriptResult - JavaScript スクリプトを表します。
  6. ContentResult - テキストの結果を表します。
  7. FileContentResult - ダウンロード可能なファイル (バイナリ コンテンツを含む) を表します。
  8. FilePathResult - ダウンロード可能なファイル (パスを含む) を表します。
  9. FileStreamResult - ダウンロード可能なファイル (ファイル ストリームを含む) を表します。

これらのアクションの結果はすべて、ベースとなる ActionResult クラスから継承されます。

ほとんどの場合、コントローラー アクションは ViewResult を返します。 たとえば、リスト 2 のインデックス コントローラー アクションは ViewResult を返します。

リスト 2 - Controllers\BookController.cs

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

namespace MvcApplication1.Controllers
{
    public class BookController : Controller
    {
        public ActionResult Index()
        {
            // Add action logic here
            return View();
        }
    }
}

アクションが ViewResult を返すと、HTML がブラウザーに返されます。 リスト 2 の Index() メソッドは、Index という名前のビューをブラウザーに返します。

リスト 2 の Index() アクションでは ViewResult() が返されないことに注意してください。 代わりに、Controller 基底クラスの View() メソッドが呼び出されます。 通常、アクションの結果は直接返されません。 代わりに、Controller 基底クラスの次のいずれかのメソッドを呼び出します。

  1. View - ViewResult アクションの結果を返します。
  2. Redirect - RedirectResult アクションの結果を返します。
  3. RedirectToAction - RedirectToRouteResult アクションの結果を返します。
  4. RedirectToRoute - RedirectToRouteResult アクションの結果を返します。
  5. Json - JsonResult アクションの結果を返します。
  6. JavaScriptResult - JavaScriptResult の結果を返します。
  7. Content - ContentResult アクションの結果を返します。
  8. File - メソッドに渡されるパラメーターに応じて、FileContentResult、FilePathResult、または FileStreamResult を返します。

したがって、ブラウザーにビューを返す場合は、View() メソッドを呼び出します。 あるコントローラー アクションから別のコントローラー アクションにユーザーをリダイレクトする場合は、RedirectToAction() メソッドを呼び出します。 たとえば、リスト 3 の Details() アクションは、Id パラメーターに値があるかどうかに応じて、ビューを表示するか、Index() アクションにユーザーをリダイレクトします。

リスト 3 - CustomerController.cs

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    public class CustomerController : Controller
    {
        public ActionResult Details(int? id)
        {
            if (!id.HasValue)
                return RedirectToAction("Index");

            return View();
        }

        public ActionResult Index()
        {
            return View();
        }

    }
}

ContentResult アクションの結果は特別です。 ContentResult アクションの結果を使用して、アクションの結果をプレーン テキストとして返すことができます。 たとえば、リスト 4 の Index() メソッドは、HTML ではなくプレーン テキストとしてメッセージを返します。

リスト 4 - Controllers\StatusController.cs

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    public class StatusController : Controller
    {
        public ActionResult Index()
        {
            return Content("Hello World!");
        }
    }
}

StatusController.Index() アクションが呼び出されると、ビューは返されません。 代わりに、生のテキスト "Hello World!" がブラウザーに返されます。

コントローラー アクションがアクションの結果以外の結果 (日付や整数など) を返した場合、結果は ContentResult に自動的にラップされます。 たとえば、リスト 5 の WorkController の Index() アクションが呼び出されると、日付は ContentResult として自動的に返されます。

リスト 5 - WorkController.cs

using System;
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    public class WorkController : Controller
    {
        public DateTime Index()
        {
            return DateTime.Now;
        }
    }
}

リスト 5 の Index() アクションは DateTime オブジェクトを返します。 ASP.NET MVC フレームワークは、DateTime オブジェクトを文字列に変換し、DateTime 値を ContentResult に自動的にラップします。 ブラウザーは、日付と時刻をプレーン テキストとして受け取ります。

まとめ

このチュートリアルの目的は、ASP.NET MVC コントローラー、コントローラーのアクション、コントローラーのアクションによる結果の概念を紹介することです。 最初のセクションでは、新しいコントローラーを ASP.NET MVC プロジェクトに追加する方法について学習しました。 次に、コントローラーのパブリック メソッドがコントローラー アクションとして世界に公開される仕組みについて学習しました。 最後に、コントローラー アクションから返すことができるさまざまな種類のアクション結果について学習しました。 特に、コントローラー アクションから ViewResult、RedirectToActionResult、および ContentResult を返す方法について説明しました。