博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.Net MVC 自定义Action类型,XmlAction,ImageAction等
阅读量:5760 次
发布时间:2019-06-18

本文共 2734 字,大约阅读时间需要 9 分钟。

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

错误实例:

public string GetXmlData(){  return "
";}//通过跟踪,会发现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("
");}

这样你访问该服务,会在浏览器上打印出完整的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类型。

 

转载地址:http://mvlkx.baihongyu.com/

你可能感兴趣的文章
放弃OpenStack?恐怕还不到时候
查看>>
苏宁精准营销之生成人群包的演进
查看>>
.NET开源现状
查看>>
Dave Farley:持续交付的基本原理
查看>>
天猫双十一这十年:从“人肉云计算”到“脉冲计算”经历了什么
查看>>
可替换元素和非可替换元素
查看>>
2016/08/25 The Secret Assumption of Agile
查看>>
Installing Chocolatey没有安装成功问题。
查看>>
Spring Boot 开发指南(2):最快速且方便的集成Mybatis
查看>>
pcl可视化的那些事
查看>>
JS实现博客前端页面(五) —— 封装弹窗拖拽事件
查看>>
webpack实践笔记(二)---添加 loaders
查看>>
flex布局踩过的那些坑
查看>>
程序员如何方便的看API文档?
查看>>
为什么gulp中的sourcemaps没起作用
查看>>
Erlang/Elixir: 连接到远程节点
查看>>
OCLint 规则与结果分析
查看>>
修改阿里云服务器ECS的hostname
查看>>
遗传算法解背包问题(javascript实现)
查看>>
使用React-route和Webpack快速构建一个react程序
查看>>