ViewResult()とActionResult()の違い


295

違いは何であるViewResult()ActionResult()ASP.NET MVCでは?

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

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

12
すばらしい質問です。私はビデオを見て、ユニットテストを作成するために、インストラクターは最初に、テストするアクションの戻り値の型をActionResultからViewResultに変更しました。説明なし...私は「タイプをランダムに変更できるのは何ですか?説明なし」のようでした
ダグチェン

3
おそらくこのドキュメントは便利です:) msdn.microsoft.com/en-us/library/...
user3885927

回答:


372

ActionResultは、いくつかのサブタイプを持つことができる抽象クラスです。

ActionResultサブタイプ

  • ViewResult-指定されたビューを応答ストリームにレンダリングします

  • PartialViewResult-指定された部分ビューを応答ストリームにレンダリングします

  • EmptyResult-空の応答が返されます

  • RedirectResult-指定されたURLへのHTTPリダイレクトを実行します

  • RedirectToRouteResult-指定されたルートデータに基づいて、ルーティングエンジンによって決定されたURLへのHTTPリダイレクションを実行します

  • JsonResult-指定されたViewDataオブジェクトをJSON形式にシリアル化します

  • JavaScriptResult-クライアントで実行できるJavaScriptコードを返します

  • ContentResult-ビューを必要とせずにコンテンツを応答ストリームに書き込みます

  • FileContentResult-ファイルをクライアントに返します

  • FileStreamResult-ストリームによって提供されるファイルをクライアントに返します

  • FilePathResult-ファイルをクライアントに返します

資源


5
ActionResultよりもViewResultを返すことの利点は何ですか?少し意味があり、意図を示していますか?しかし、実際には通常違いはありませんか?
niico

121

ActionResultは抽象クラスです。

ViewResultActionResultから派生します。その他の派生クラスには、JsonResultPartialViewResultがあります。

この方法で宣言すると、ポリモーフィズムを利用して、同じメソッドで異なる型を返すことができます。

例えば:

public ActionResult Foo()
{
   if (someCondition)
     return View(); // returns ViewResult
   else
     return Json(); // returns JsonResult
}

2
それは私たちがそれの利点を得るために常にActionResultを返さなければならないことを意味しますか?または、これの制限または副作用はありますか?
Adarsh Kumar

5
@Adarsh-C#のどの抽象クラスでも同じです。メソッド内に実装をカプセル化したい場合、または他の派生型に対してAPIの将来の証明をしたい場合は、そのように宣言します。そうでない場合は、コンクリートを使用してください。私は通常、具体的に使用します(例:ViewResultまたはJsonResult)
RPM1984

31

同じ理由で、「オブジェクト」を返すためにすべてのクラスのすべてのメソッドを作成する必要はありません。できるだけ具体的にする必要があります。これは、単体テストを作成する場合に特に役立ちます。戻り値の型をテストしたり、結果をキャストしたりする必要はもうありません。


クリーンなコードと単体テストは、私の経験に基づくViewResultを使用する利点です。
JoshYates1980 2016年

20

ViewResultはActionResultのサブクラスです。ViewメソッドはViewResultを返します。つまり、これら2つのコードスニペットはまったく同じことを行います。唯一の違いは、ActionResultの場合、コントローラーはビューを返すことを約束していないということです。メソッドの本体を変更して、メソッドの定義を変更せずに、条件付きでRedirectResultなどを返すことができます。


11

他の回答では違いが正しく指摘されていますが、実際にViewResultのみを返す場合は、基本のActionResultタイプではなく、より具体的なタイプを返すほうがよいことに注意してください。この原則の明らかな例外は、メソッドがActionResultから派生した複数の型を返す場合です。

この原則の背後にある理由の詳細については、関連するこちらの説明を参照してください。ASP.NETMVCコントローラーメソッドはActionResultを返す必要がありますか?


4

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


4
これが意図したものかどうかはわかりませんが、名前と(no)パラメータが同じであるため、これら2つのメソッドを同時に使用できないことを明確にしたい場合に備えて。結果のタイプを変更するだけでメソッドをオーバーロードすることはできません。
Andrew

0

コントローラーでは、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は、さまざまなタイプのビューを返す場合に最適です。


0

ここで時間を節約するために、前の回答のリンクからの回答があります https://forums.asp.net/t/1448398.aspxのます。

ActionResultは抽象クラスであり、ViewResultクラスの基本クラスです。

MVCフレームワークでは、ActionResultクラスを使用して、アクションメソッドが返すオブジェクトを参照します。そして、その上でExecuteResultメソッドを呼び出します。

そして、ViewResultはこの抽象クラスの実装です。指定されたビュー名によって、いくつかの事前定義されたパス(/ views / controllername /、/ views / shared /など)でビューページ(通常はaspxページ)を見つけようとします。

通常、メソッドでより具体的なクラスを返すことをお勧めします。したがって、アクションメソッドがビューページを返すことが確実な場合は、ViewResultを使用できます。ただし、アクションメソッドの動作が異なる場合(ビューのレンダリングやリダイレクトの実行など)。より一般的な基本クラスActionResultを戻り値の型として使用できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.