让ASP.NET MVC页面返回不同类型的内容2011-03-26 MSDN 诸剑俊在ASP.NET MVC的controller中大部分方法返回的都是ActionResult,更确切的是 ViewResult。它返回了一个View,一般情况下是一个HTML页面。但是在某些情况下我们可 能并不需要返回一个View,我们可能需要的是一个字符串,一个json或xml格式的文本, 一个图片。 ActionResult是一个抽象类,我们平时比较常用的ViewResult是它的派生类 ,所以我们也可以写一个StringResult、 XmlResult、ImageResult来实现上面提到的需 求。由于返回字符串可以有更简单的方法,直接将需要返回字符串的方法的返回值设置成 string型就可以了,JsonResult在ASP.NET MVC中已经有提供。所以下面只演示XmlResult 和ImageResult。 ASP.NET MVC项目是开源的(可以在http://www.codeplex.com/aspnet 下载源代码),所以我们可以参考其中ViewResult和 JsonResult的代码进行改写。主要 的思路是设置返回数据流HTTP Header中的Content-Type,然后将要返回的内容写入 Response中。先演示XmlResultXmlResult的代码:
1 public class XmlResult:ActionResult
2     {
3          // 可被序列化的内容
4         object Data { get;  set; }
5
6         // Data的类型
7         Type  DataType { get; set; }
8
9         // 构造器
10          public XmlResult(object data,Type type)
11          {
12             Data = data;
13              DataType = type;
14         }
15
16         //  主要是重写这个方法
17         public override void  ExecuteResult(ControllerContext context)
18         {
19              if (context == null)
20              {
21                 throw new ArgumentNullException ("context");
22             }
23
24              HttpResponseBase response = context.HttpContext.Response;
25
26              // 设置 HTTP Header 的 ContentType
27              response.ContentType = "text/xml";
28
29              if (Data != null)
30             {
31                  // 序列化 Data 并写入 Response
32                  XmlSerializer serializer = new XmlSerializer (DataType);
33                 MemoryStream ms = new  MemoryStream();
34                 serializer.Serialize (ms,Data);
35                 response.Write (System.Text.Encoding.UTF8.GetString(ms.ToArray()));
36              }
37         }
38     }在controller中调用它
1 public ActionResult Xml()
2         {
3              // 创建一个DemoModal对象,No属性为1,Title属性为Test
4              DemoModal dm = new DemoModal() { No = 1, Title  = "Test" };
5
6             // 序列化为XML格式显示 
7             XmlResult xResult = new XmlResult(dm,  dm.GetType());
8             return xResult;
9          }显示出来的结果