首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET MVC 實作自訂 ActionResult 回傳 XML、圖片等多元內容類型

     編輯:關於ASP.NET

在 ASP.NET MVC 控制器中,動作方法預設回傳 ActionResult,最常見的是 ViewResult(渲染 HTML 視圖)。但實際開發中,我們常需要直接輸出字串、JSON、XML 甚至二進位圖片等非 HTML 內容。雖然 JsonResult 內建支援,字串只需將回傳型別改為 string 即可,但 XML 與圖片輸出則需自行實作自訂 ActionResult。

核心原理:繼承 ActionResult 抽象類別

ActionResult 為抽象基類,核心在於覆寫 ExecuteResult(ControllerContext context) 方法。在此方法中:

  1. 設定 HTTP 回應標頭 Content-Type(如 text/xml、image/png)。
  2. 將序列化後的資料寫入 HttpResponseBase.OutputStream 或 HttpResponseBase.Write()。

ASP.NET MVC 專案開源(可從 CodePlex 下載原始碼),參考 ViewResult、JsonResult 的實作即可快速開發。

實作 XmlResult:輸出 XML 序列化資料

以下為完整的 XmlResult 實作範例:

public class XmlResult : ActionResult
{
    public object Data { get; set; }
    public Type DataType { get; set; }

    public XmlResult(object data, Type type)
    {
        Data = data;
        DataType = type;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
            throw new ArgumentNullException(nameof(context));

        var response = context.HttpContext.Response;
        response.ContentType = "text/xml";

        if (Data != null)
        {
            var serializer = new XmlSerializer(DataType);
            using (var ms = new MemoryStream())
            {
                serializer.Serialize(ms, Data);
                var xmlString = Encoding.UTF8.GetString(ms.ToArray());
                response.Write(xmlString);
            }
        }
    }
}

控制器中呼叫範例

public ActionResult GetXml()
{
    var model = new DemoModel { No = 1, Title = "Test" };
    return new XmlResult(model, model.GetType());
}

瀏覽器將顯示 XML 格式資料:

XML 輸出結果

延伸應用:ImageResult 輸出圖片

同理可實作 ImageResult,設定 ContentType = "image/jpeg"(或 png/gif),並將 byte[] 或 Stream 直接寫入 Response.OutputStream,即可動態產生驗證碼、圖表或縮圖。

總結

透過自訂 ActionResult,ASP.NET MVC 可靈活回傳任何格式內容,滿足 Web API、AJAX 回呼、檔案下載等多樣化需求,且程式碼結構清晰、易於維護擴充。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved