ASP.NET MVCのViewResult()
とActionResult()
の違いは何ですか?
public ViewResult Index()
{
return View();
}
public ActionResult Index()
{
return View();
}
ActionResultは、いくつかのサブタイプを持つことができる抽象クラスです。
ViewResult - 指定されたビューを応答ストリームにレンダリングします
PartialViewResult - 指定された部分ビューを応答ストリームにレンダリングします
EmptyResult - 空の応答が返される
RedirectResult - 指定されたURLへのHTTPリダイレクトを実行します
RedirectToRouteResult - 指定されたルートデータに基づいて、ルーティングエンジンによって決定されたURLへのHTTPリダイレクトを実行します。
JsonResult - 指定されたViewDataオブジェクトをJSON形式にシリアル化します
JavaScriptResult - クライアント上で実行可能なJavaScriptコードの一部を返します
ContentResult - ビューを必要とせずにコンテンツをレスポンスストリームに書き込みます。
FileContentResult - ファイルをクライアントに返します
FileStreamResult - Streamによって提供されるファイルをクライアントに返します。
FilePathResult - ファイルをクライアントに返します
ActionResultは抽象クラスです。
ViewResultはActionResultから派生します。他の派生クラスには、JsonResultおよびPartialViewResultがあります。
このように宣言すると、多態性を利用して同じメソッドで異なる型を返すことができます。
例えば:
public ActionResult Foo()
{
if (someCondition)
return View(); // returns ViewResult
else
return Json(); // returns JsonResult
}
それはあなたが "オブジェクト"を返すようにすべてのクラスのすべてのメソッドを書かないのと同じ理由です。あなたはできるだけ具体的であるべきです。あなたがユニットテストを書くことを計画しているなら、これは特に価値があります。これ以上のテストで型を返すことや結果をキャストすることはありません。
ViewResultはActionResultのサブクラスです。 ViewメソッドはViewResultを返します。したがって、これら2つのコードスニペットはまったく同じことを行います。唯一の違いは、ActionResultでは、コントローラがビューを返すことを約束していないということです。メソッド定義を変更せずに、メソッド本体を変更してRedirectResultなどを条件付きで返すことができます。
他の回答では違いを正しく指摘していますが、実際にViewResultのみを返す場合は、基本のActionResult型ではなく、より具体的な型を返す方が良いことに注意してください。この原則の明らかな例外は、メソッドがActionResultから派生した複数の型を返す場合です。
この原則の背後にある理由の詳細な説明については、こちらの関連説明を参照してください。 ASP.NET MVCコントローラメソッドはActionResultを返す必要がありますか?
コントローラでは、以下の構文を使うことができます。
public ViewResult EditEmployee() {
return View();
}
public ActionResult EditEmployee() {
return View();
}
上記の例では、戻り型のみが異なります。一方はViewResult
を返し、もう一方はActionResult
を返します。
ActionResultは抽象クラスです。それは受け入れることができます:
ViewResult、PartialViewResult、EmptyResult、RedirectResult、RedirectToRouteResult、JsonResult、JavaScriptResult、ContentResult、FileContentResult、FileStreamResult、FilePathResultなどです。
ViewResult
はActionResult
のサブクラスです。
コントローラでは、ActionResultで以下のコードを指定しました。これは、ViewResult、PartialViewResult、EmptyResult、RedirectResult、RedirectToRouteResult、JsonResult、JavaScriptResult、ContentResult、FileContentResult、FilePathResultのように、11のサブタイプを持つことができます。
public ActionResult Index()
{
if (HttpContext.Session["LoggedInUser"] == null)
{
return RedirectToAction("Login", "Home");
}
else
{
return View(); // returns ViewResult
}
}
//More Examples
[HttpPost]
public ActionResult Index(string Name)
{
ViewBag.Message = "Hello";
return Redirect("Account/Login"); //returns RedirectResult
}
[HttpPost]
public ActionResult Index(string Name)
{
return RedirectToRoute("RouteName"); // returns RedirectToRouteResult
}
同様に、すべてのサブタイプメソッドを明示的に指定しなくても、ActionResult()を使用してこれら11のサブタイプすべてを返すことができます。 ActionResultは、さまざまな種類のビューを返す場合に最適です。