2011-12-17 17 views
1

以外のビューを探し、他の基底クラスがあり、我々はコントローラのアクション以下したとします。は、ASP.NET MVC 3でSystem.Web.Mvc.ViewResultBase

ここ
public ActionResult Index() { 

    ViewBag.Message = "Foo Bar"; 
    return View(); 
} 

を、Index方法がありますSystem.Web.Mvc.ViewResultBaseクラスを実装するViewResultインスタンスを返します。 ViewResultクラスのインスタンスが返されるため、システムは出力を生成するために適切なビューファイルを見つけようとします。見つからない場合は、例外がスローされます。

私の質問はこれです:

System.Web.Mvc.ViewResultBase以外のビューを探し、他のベースクラスはありますか?

普通の英語では、結果をビューでレンダリングするために、コントローラーアクションからクラスSystem.Web.Mvc.ViewResultBaseを実装するクラスを返す必要がありますか?あなたは私はいわば、基本クラスをベースですActionResultの種類を返すことを言っていますここで見るよう

EDITまた

、。最後を見ると、私はViewResultのインスタンスを返しています。

フレームワークはそれをどのように処理しますか?すべてのコントローラーのアクション結果を即時にViewResultBaseクラスにキャストしようとしていますか?私は本当にこの部分について本当に興味があります。

答えて

1

ControllerActionInvokerクラスは、コントローラアクションの実行を担当します。戻り値の型がvoidであれば、それはリターンがActionResult以外のものを入力した場合EmptyResult

  • を作成し、それを文字列に返された値を変換し

    1. :アクションを見つけ、実行した後には、アクションの戻り値の型を探しますその文字列でContentResultを作成します。

    だから、最終的にはアクションの結果は、常に次のメソッドを宣言しActionResultクラスのインスタンスである:

    public abstract void ExecuteResult(ControllerContext context); 
    

    はその後ControllerActionInvokerは基本的にActionResultがへの書き込みを可能にするために、このExecuteResultメソッドを呼び出しますReponseViewResultBaseの場合、ビューのレンダリングが行われています。
    MVC3の第1の質問に答えるには、ViewResultBaseクラスのデセンダントだけがレンダリングビューです。

  • +0

    お返事ありがとうございました。質問に私の編集を見ることができますか?私は本当にその部分についても興味があります。 – tugberk

    +1

    いいえ、コントローラーのアクションの戻り値をキャストしません。単にその上で 'ExecuteResult'メソッドを呼び出します。これは 'ViewResultBase'実装でビューをレンダリングし、それをレスポンスに書き込みます。 – nemesv

    +0

    Owwなので、 'ViewResultBase'クラスは通常、それ自身の必要性のために' ActionResult.ExecuteResult'メソッドをオーバーライドします。 – tugberk