MVC开发的时候,难免会用到XML格式数据,如果将XML数据当作字符串直接返回给前台,其实这不是真正意义上的xmL,你可以看到ContentType是text/html而非XML类型,这往往会造成前端架构无法解析的情况,例如Extjs。

错误实例:

public string GetXmlData()
{
  return "<ROOT><List><user><name></name><sex></sex></user></List></ROOT>";
}
//通过跟踪,会发现ContentType:text/html类型的

定义XmlAction:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Xml.Serialization; namespace ElegantWM.WebUI
{
public class XmlResult : ActionResult
{
// 可被序列化的内容
object Data { get; set; } // Data的类型
Type DataType { get; set; } // 构造器
public XmlResult(string data)
{
Data = data;
}
public XmlResult(object data, Type type)
{
Data = data;
DataType = type;
}
//静态调用
public static XmlResult Xml(string data)
{
return new XmlResult(data);
}
// 主要是重写这个方法
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)
{
if (DataType == null)
response.Write(Data);
else
{
//序列化 Data 并写入 Response
XmlSerializer serializer = new XmlSerializer(DataType);
MemoryStream ms = new MemoryStream();
serializer.Serialize(ms, Data);
response.Write(System.Text.Encoding.UTF8.GetString(ms.ToArray()));
}
}
}
}
}

使用:

[Description("获取列表")]
[Action]
[HttpGet]
public XmlResult Get()
{
return XmlResult.Xml("<ROOT><List><user><name></name><sex></sex></user></List></ROOT>");
}

这样你访问该服务,会在浏览器上打印出完整的xml架构,而非一串字符。

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);
}
}

其实关键点就是respone.ContentType,你可以以此扩展其他的Result类型。

最新文章

  1. 珍珠(bead)
  2. JavaScript(二) DOM
  3. 知乎背景图 canvas 效果
  4. 使用maven profile实现多环境可移植构建(转自CSDN)
  5. Python学习【第一篇】Python简介
  6. 【Javascript】—— 1 方法function的高级特性
  7. ruby学习总结02
  8. 在Hyper-V虚拟机中使用Wi-Fi上网
  9. netlink
  10. 【STL源码学习】STL算法学习之二
  11. AndroidManifest.xml中的application中的name属性 分类: android 学习笔记 2015-07-17 16:51 116人阅读 评论(0) 收藏
  12. JS~重写alter与confirm,让它们变成fancybox风格
  13. c++中volatile详解
  14. Url有值怎么使用get传值
  15. 关于JAVA IO流的学习
  16. Java学习笔记——封装、继承和多态
  17. SparkMLlib学习之线性回归
  18. Discuz更改默认搜索模块
  19. Java系列 – 用Java8新特性进行Java开发太爽了(续)
  20. mybatis的那些事

热门文章

  1. Knockout: 使用knockout validation插件进行校验, 给未通过校验的输入框添加红色边框突出显示.
  2. python标准库介绍——32 Queue 模块详解
  3. Docker 建立镜像流程
  4. 为什么推荐你用 Kotlin语言?
  5. C# delegate 委托
  6. Sql Server删除数据表中重复记录 三种方法
  7. 防CSRF攻击:一场由重复提交的问题引发的前端后端测试口水战
  8. 《Android源代码设计模式解析》读书笔记——Android中你应该知道的设计模式
  9. 常用sql自定义函数
  10. Android 自定义Dialog 去除阴影