ASP.NET MVCにおけるアクション戻り値タイプ

4429 ワード

Actionの戻り値タイプは全部で十数種類提供されています.その中でよく使われるいくつかのタイプを簡単に要約します.
1、ActionResult
すべてのResultはActionResult抽象クラスから派生しているため、ActionResultはベースクラスとして最も基礎的な機能を提供しており、ActionResultは抽象クラスであり、以下のように宣言されています.
public abstract class ActionResult {
        public abstract void ExecuteResult(ControllerContext context);
}

 2、EmptyResult
 public class EmptyResult : ActionResult {

        private static readonly EmptyResult _singleton = new EmptyResult();
        internal static EmptyResult Instance {
            get {
                return _singleton;
            }
        }
        public override void ExecuteResult(ControllerContext context) {
        }
    }

Actionで、空のページを返すには、次のようにします(一般的ではありません).
public ActionResult Index()
{
 return new EmptyResult();
}

3、RedirectResult
   public override void ExecuteResult(ControllerContext context) {
            if (context == null) {
                throw new ArgumentNullException("context");
            }
            string destinationUrl = UrlHelper.Content(Url, context.HttpContext);
            context.HttpContext.Response.Redirect(destinationUrl, false /* endResponse */);
        }

RedirectResultは、転送を実行するために使用されます.実はRedirectResultは最終的にResponseを呼び出しました.Redirect()は移行するため、現在のプロジェクトまたはネットワークを含む任意のUrlにRedirectResultを使用してジャンプできます.現在のプロジェクトのパスには、UrlHelperが使用されているためです.Content()メソッドはターゲットパスを取得するため、RedirectResultによって渡されるUrlは、現在のプロジェクトディレクトリ識別子~(すなわちアプリケーションディレクトリ)を同時にサポートします.
4、RedirectToRouteResult
RedirectToRouteResultは、RedirectResultにとって、ルーティングにのみ移行可能であり(ルーティングマッチングの結果は、最終的には現在のプロジェクトに対するUrlであり、例えば:/Home/Index)、総じてRedirectResultの最終的な役割と同様に移行を実行する.RedirectResultは任意の指定されたUrlに直接移行し、RedirectToRouteResultは指定されたルーティングに移行する(ルーティングマッチングの結果も最終的には1つのUrlである):
 
public override void ExecuteResult(ControllerContext context) {
            if (context == null) {
                throw new ArgumentNullException("context");
            }
            string destinationUrl = UrlHelper.GenerateUrl(RouteName, null /* actionName */, null /* controllerName */, RouteValues, Routes, context.RequestContext, false /* includeImplicitMvcValues */);

            if (String.IsNullOrEmpty(destinationUrl)) {
                throw new InvalidOperationException(MvcResources.ActionRedirectResult_NoRouteMatched);
            }
             context.HttpContext.Response.Redirect(destinationUrl, false /* endResponse */);

        }

5、ContentResult
ContentResultは、文字列をクライアントに直接出力するために使用されます.ContentResultのExecuteResultメソッドは実際にResponseを呼び出す.Write(string...)、簡単な文字列を出力してページ全体に、Response.Write()はすべて適任なので、ContentResultは特に強いように見えます.
 
public override void ExecuteResult(ControllerContext context) {
            if (context == null) {
                throw new ArgumentNullException("context");
            }
            HttpResponseBase response = context.HttpContext.Response;
            if (!String.IsNullOrEmpty(ContentType)) {

                response.ContentType = ContentType;

            }
            if (ContentEncoding != null) {
                response.ContentEncoding = ContentEncoding;
            }

            if (Content != null) {
                response.Write(Content);
            }
        }

出力されたコンテンツが何も提供されていない場合、ContentResultが提示した結果はEmptyResultと同じであり、最も基本的なタグコンテンツが空のHTMLを出力し、コンテンツが空でない場合、これらのコンテンツを直接出力する(他のHTMLコードは出力しない).
    public ActionResult Index()
{
     return Content( "a" );
}

実際ContentResultからActionResultは特別ではありませんが、前のいくつかのResultから見ると、実はResponseにすぎません.RedirectまたはResponse.Write,またバイナリストリームResponseを利用することもできる.OutputStream.Writeはクライアントにファイルをアップロードする......これにより,より多くの実用的な意味のResultを拡張して作成する.例えばXmlResult(ファイル)、RssResult(XmlResultと実は同じ)などです.