MVC3.0ステップ-コントローラと操作方法(5)
ASP.NET MVCアプリケーションのコントローラ
ASP.NET MVCフレームワークは、「コントローラ」と呼ばれるクラスにURLをマッピングすることができる.コントローラは、入力されたリクエストを処理し、ユーザーの入力とインタラクションを処理し、対応するアプリケーションロジックを実行します.Controllerクラスでは、通常、HTMLタグの生成を要求するために個別のビューコンポーネントが呼び出されます.
すべてのコントローラに適用されるベースクラスは、通常のMVC処理が可能なControllerBaseクラスである.ControllerクラスはControllerBaseから継承され、コントローラのデフォルト実装です.Controllerクラスは、次の処理フェーズを担当します.
すべてのコントローラクラスには、Controller接尾辞を使用して名前を付ける必要があります.次の例では、HomeControllerというcontrollerクラスの例を示します.このコントローラクラスには、ビューページを表示する操作方法が含まれています.
[HandleError]
public class HomeController : Controller
{
public ActionResult Index()
{
ViewData["Message"] = "Welcome to ASP.NET MVC!";
return View();
}
public ActionResult About()
{
return View();
}
}
操作方法
MVCフレームを使用するASP.NETアプリケーションでは、通常、ユーザーインタラクションは、ページ、ページおよびページコントロールによって開始されるイベント、およびページおよびページコントロールによって開始されるイベントの処理の面を中心に組織されます.それに比べてASP.NET MVCアプリケーションでは,ユーザインタラクションがコントローラと操作方法の周りで組織される.コントローラは操作方法を定義します.コントローラは、必要に応じて複数の操作方法を含んでもよい.
操作方法とユーザのインタラクションの間には、通常、1対1のマッピング関係があります.たとえば、ユーザーインタラクションには、ブラウザにURLを入力したり、リンクをクリックしたり、フォームをコミットしたりすることが含まれます.これらのユーザーインタラクションの各項目は、要求をサーバに送信します.いずれの場合も、要求されたURLには、動作方法を呼び出すためのMVCフレームワークの情報が含まれる.
ユーザがブラウザにURLを入力と、MVCアプリケーションはGlobalを使用する.asaxファイルで定義されたルーティング規則は、URLを解析し、コントローラのパスを決定します.その後、コントローラは、要求を処理するために適切な操作方法を決定します.デフォルトでは、要求されたURLは、操作名が後に続くコントローラ名を含むサブパスとみなされます.例えば、ユーザがURLを入力するとhttp://contoso.com/MyWebSite/Products/Categoriesを選択すると、サブパスは/Products/Categoriesになります.デフォルトのルーティング・ルールでは、Productsはコントローラのプレフィックス名(ProductsControllerなど)とみなされ、Categoriesはアクションの名前とみなされます.したがって、ルーティング規則は、ProductsコントローラのCategoriesメソッドを呼び出して要求を処理する.URLが/Products/Detail/5で終わる場合、デフォルトのルーティング・ルールは「Detail」をアクションの名前と見なし、ProductsコントローラのDetailメソッドを呼び出してリクエストを処理します.デフォルトでは、このURLの値「5」がパラメータとしてDetailメソッドに渡されます.
次の例では、HelloWorldの操作方法を持つコントローラクラスを示します.public class MyController : Controller
{
public ActionResult HelloWorld()
{
ViewData["Message"] = "Hello World!";
return View();
}
}
ActionResult戻りタイプ
ほとんどの操作方法では、ActionResultから派生したクラスのインスタンスが返されます.ActionResultクラスは、すべての操作結果の基礎です.ただし、操作方法によって実行されるタスクに応じて、異なる操作結果タイプも存在します.たとえば、最も一般的な操作はViewメソッドを呼び出すことです.Viewメソッドは、ActionResultから派生したViewResultクラスのインスタンスを返します.
文字列、整数、ブール値などの任意のタイプのオブジェクトを返す操作方法も作成できます.これらの戻りタイプは、応答フローに提示される前に適切なActionResultタイプにパッケージされる.
次の表に、組み込み操作結果タイプと、これらのタイプを返す操作ヘルプメソッドを示します.
説明
操作結果
ヘルプメソッド
ViewResult
View
ビューをWebページとして表示します.
PartialViewResult
PartialView
別のビューに表示できるビューの一部を定義する分割ビューが表示されます.
RedirectResult
Redirect
そのURLを使用して別の操作方法にリダイレクトします.
RedirectToRouteResult
RedirectToAction、RedirectToRoute
別の操作方法にリダイレクトします.
ContentResult
Content
ユーザー定義のコンテンツタイプを返します.
JsonResult
Json
シーケンス化されたJSONオブジェクトを返します.
JavaScriptResult
JavaScript
クライアントで実行できるスクリプトを返します.
FileResult
File
応答に書き込むバイナリ出力を返します.
EmptyResult
(なし)
操作方法でnull結果(void)を返さなければならない場合に使用される戻り値を表します.
共通メソッドを非操作メソッドとしてマークする
デフォルトでは、MVCフレームワークはcontrollerクラスのすべての共通メソッドを操作メソッドと見なします.コントロールクラスに共通メソッドが含まれており、操作メソッドにしたくない場合は、NonActionAttributeプロパティでメソッドをマークする必要があります.
次の例では、NonActionプロパティタグを使用する方法を示します.[NonAction]
private void DoSomething()
{
// Method logic.
}
操作方法パラメータ
デフォルトでは、操作メソッドパラメータの値は、要求されたデータ収集から取得されます.データ収集には、フォームデータ名-数値ペア、クエリー文字列値、クッキー値が含まれます.
Controllerクラスは、操作方法を検索し、RouteDataインスタンスとフォームデータに基づいて操作方法のすべてのパラメータ値を決定します.パラメータ値を解析できず、パラメータタイプが参照タイプまたはnull値のタイプである場合、nullはパラメータ値として渡されます.異常が発生します.
コントロールクラスの操作方法のURLパラメータ値には、さまざまな方法でアクセスできます.Controllerクラスでは、操作方法でアクセスできるRequestとResponseのプロパティが公開されます.これらの属性は既にASP.NETの一部のHttpRequestとHttpResponseオブジェクトは同じ意味を持つ.ただし、ControllerクラスのRequestオブジェクトとResponseオブジェクトは、シールクラスではなくHttpRequestBaseオブジェクトとHttpResponseBase抽象クラスを実装するオブジェクトを受け入れます.これらのベースクラスを使用すると、mockオブジェクトを簡単に作成でき、controllerクラスのユニットテストを簡単に作成できます.
次の例では、Requestオブジェクトを使用してidというクエリー文字列値を取得する方法を示します.public void Detail()
{
int id = Convert.ToInt32(Request["id"]);
}
自動マッピング操作方法パラメータ
ASP.NET MVCフレームワークは、URLパラメータ値を操作方法のパラメータ値に自動的にマッピングすることができる.デフォルトでは、動作方法がパラメータを使用する場合、MVCフレームワークは、入力された要求データをチェックし、その要求に同じ名前のHTTP要求値が含まれているかどうかを決定します.含まれる場合、要求値は操作メソッドに自動的に渡されます.
次の例では、上記の例のバリエーションを示します.この変形では、idパラメータが、名前もidの要求値にマッピングされると仮定する.この自動マッピングのため、操作方法は、要求からパラメータ値を取得するためのコードを含む必要がないため、パラメータ値がより使いやすい.public ResultAction Detail(int id)
{
ViewData["DetailInfo"] = id;
return View();
}
クエリー文字列値として埋め込むのではなく、パラメータ値をURLの一部として埋め込むこともできます.たとえば、/Products/Detail/3などのURLを使用できます./Products/Detailなどのクエリー文字列を含むURLを使用するのではなく、/Products/Detail/3などのURLを使用できます.id=3. デフォルトのルーティングマッピング規則のフォーマットは/{controller}/{action}/{id}です.URLにコントローラと操作名の後ろにURLサブパスがある場合、そのサブパスはidというパラメータとして扱われ、自動的にパラメータ値として操作方法に渡されます.
MVCフレームワークは、操作方法のオプションパラメータもサポートする.MVCフレームワーク内の任意のパラメータは、nullタイプの実パラメータとして、コントローラ操作方法を使用して処理することができる.たとえば、メソッドでクエリー文字列の一部として日付を使用できますが、クエリー文字列パラメータが欠けている場合、デフォルト値を当日の日付にしたい場合は、次の例のコードと似たコードを使用できます.public ActionResult ShowArticles(DateTime? date)
{
if(!date.HasValue)
{
date = DateTime.Now;
}
// ...
}
要求に日付パラメータの値が含まれている場合、その値はShowArticlesメソッドに渡されます.リクエストにこのパラメータの値が含まれていない場合、実パラメータはnullであり、コントローラは欠落したパラメータを処理するために必要な任意の操作を採用することができる.
public class MyController : Controller
{
public ActionResult HelloWorld()
{
ViewData["Message"] = "Hello World!";
return View();
}
}
[NonAction]
private void DoSomething()
{
// Method logic.
}
public void Detail()
{
int id = Convert.ToInt32(Request["id"]);
}
public ResultAction Detail(int id)
{
ViewData["DetailInfo"] = id;
return View();
}
public ActionResult ShowArticles(DateTime? date)
{
if(!date.HasValue)
{
date = DateTime.Now;
}
// ...
}