違いは何であるViewResult()
とActionResult()
ASP.NET MVCでは?
public ViewResult Index()
{
return View();
}
public ActionResult Index()
{
return View();
}
違いは何であるViewResult()
とActionResult()
ASP.NET MVCでは?
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-ストリームによって提供されるファイルをクライアントに返します
FilePathResult-ファイルをクライアントに返します
ActionResultは抽象クラスです。
ViewResultはActionResultから派生します。その他の派生クラスには、JsonResultとPartialViewResultがあります。
この方法で宣言すると、ポリモーフィズムを利用して、同じメソッドで異なる型を返すことができます。
例えば:
public ActionResult Foo()
{
if (someCondition)
return View(); // returns ViewResult
else
return Json(); // returns JsonResult
}
同じ理由で、「オブジェクト」を返すためにすべてのクラスのすべてのメソッドを作成する必要はありません。できるだけ具体的にする必要があります。これは、単体テストを作成する場合に特に役立ちます。戻り値の型をテストしたり、結果をキャストしたりする必要はもうありません。
他の回答では違いが正しく指摘されていますが、実際にViewResultのみを返す場合は、基本のActionResultタイプではなく、より具体的なタイプを返すほうがよいことに注意してください。この原則の明らかな例外は、メソッドがActionResultから派生した複数の型を返す場合です。
この原則の背後にある理由の詳細については、関連するこちらの説明を参照してください。ASP.NETMVCコントローラーメソッドはActionResultを返す必要がありますか?
Controllerでは、以下の構文を使用できます
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
。
コントローラーでは、ViewResult、PartialViewResult、EmptyResult、RedirectResult、RedirectToRouteResult、JsonResult、JavaScriptResult、ContentResult、FileContentResult、FileStreamResult、FilePathResultなどの11のサブタイプを持つことができる基本クラスであるActionResultを使用して、以下のコードを指定しました。
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は、さまざまなタイプのビューを返す場合に最適です。
ここで時間を節約するために、前の回答のリンクからの回答があります https://forums.asp.net/t/1448398.aspxのます。
ActionResultは抽象クラスであり、ViewResultクラスの基本クラスです。
MVCフレームワークでは、ActionResultクラスを使用して、アクションメソッドが返すオブジェクトを参照します。そして、その上でExecuteResultメソッドを呼び出します。
そして、ViewResultはこの抽象クラスの実装です。指定されたビュー名によって、いくつかの事前定義されたパス(/ views / controllername /、/ views / shared /など)でビューページ(通常はaspxページ)を見つけようとします。
通常、メソッドでより具体的なクラスを返すことをお勧めします。したがって、アクションメソッドがビューページを返すことが確実な場合は、ViewResultを使用できます。ただし、アクションメソッドの動作が異なる場合(ビューのレンダリングやリダイレクトの実行など)。より一般的な基本クラスActionResultを戻り値の型として使用できます。