在 ASP.NET MVC 控制器中,動作方法預設回傳 ActionResult,最常見的是 ViewResult(渲染 HTML 視圖)。但實際開發中,我們常需要直接輸出字串、JSON、XML 甚至二進位圖片等非 HTML 內容。雖然 JsonResult 內建支援,字串只需將回傳型別改為 string 即可,但 XML 與圖片輸出則需自行實作自訂 ActionResult。
ActionResult 為抽象基類,核心在於覆寫 ExecuteResult(ControllerContext context) 方法。在此方法中:
Content-Type(如 text/xml、image/png)。HttpResponseBase.OutputStream 或 HttpResponseBase.Write()。ASP.NET MVC 專案開源(可從 CodePlex 下載原始碼),參考 ViewResult、JsonResult 的實作即可快速開發。
以下為完整的 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 格式資料:

同理可實作 ImageResult,設定 ContentType = "image/jpeg"(或 png/gif),並將 byte[] 或 Stream 直接寫入 Response.OutputStream,即可動態產生驗證碼、圖表或縮圖。
透過自訂 ActionResult,ASP.NET MVC 可靈活回傳任何格式內容,滿足 Web API、AJAX 回呼、檔案下載等多樣化需求,且程式碼結構清晰、易於維護擴充。