在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中。
先演示XmlResult
XmlResult的代码:
public class XmlResult:ActionResult
{
// 可被序列化的内容
object Data { get; set; }
// Data的类型
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("context");
}
HttpResponseBase response = context.HttpContext.Response;
// 设置 HTTP Header 的 ContentType
response.ContentType = "text/xml";
if (Data != null)
{
// 序列化 Data 并写入 Response
XmlSerializer serializer = new XmlSerializer(DataType);
MemoryStream ms = new MemoryStream();
serializer.Serialize(ms,Data);
response.Write(System.Text.Encoding.UTF8.GetString(ms.ToArray()));
}
}
}
在controller中调用它
public ActionResult Xml()
{
// 创建一个DemoModal对象,No属性为1,Title属性为Test
DemoModal dm = new DemoModal() { No = 1, Title = "Test" };
// 序列化为XML格式显示
XmlResult xResult = new XmlResult(dm, dm.GetType());
return xResult;
}
显示出来的结果
下面演示的是ImageResult
ImageResult的代码
public class ImageResult:ActionResult
{
// 图片
public Image imageData;
// 构造器
public ImageResult(Image image)
{
imageData = image;
}
// 主要需要重写的方法
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
HttpResponseBase response = context.HttpContext.Response;
// 设置 HTTP Header
response.ContentType = "image/jpeg";
// 将图片数据写入Response
imageData.Save(context.HttpContext.Response.OutputStream, ImageFormat.Jpeg);
}
}
在controller中调用
public ActionResult Img()
{
// 获取博客园空间顶部的banner图片
WebRequest req = WebRequest.Create("http://space.cnblogs.com/images/a4/banner.jpg");
WebResponse res = req.GetResponse();
Stream resStream = res.GetResponseStream();
Image img = Image.FromStream(resStream);
// 输出给客户端
ImageResult r = new ImageResult(img);
return r;
}
这个比较多用在向客户端传送验证码图片时。