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类型。

.Net MVC 自定义Action类型,XmlAction,ImageAction等的更多相关文章

  1. ASP.NET MVC – 关于Action返回结果类型的事儿(上)

    原文:ASP.NET MVC – 关于Action返回结果类型的事儿(上) 本文转自:博客园-文超的技术博客 一.         ASP.NET MVC 1.0 Result 几何? Action的 ...

  2. MVC自定义过滤器,自定义Area过滤器,自定义Controller,Action甚至是ViewData过滤器

    实现MVC自定义过滤器,自定义Area过滤器,自定义Controller,Action甚至是ViewData过滤器 MVC开发中几种以AOP方式实现的Filters是非常好用的,默认情况下,我们通过A ...

  3. mvc自定义全局异常处理

    异常信息处理是任何网站必不可少的一个环节,怎么有效显示,记录,传递异常信息又成为重中之重的问题.本篇将基于上篇介绍的html2cancas截图功能,实现mvc自定义全局异常处理.先看一下最终实现效果: ...

  4. 白话学习MVC(八)Action的执行二

    一.概述 上篇博文<白话学习MVC(七)Action的执行一>介绍了ASP.NET MVC中Action的执行的简要流程,并且对TempData的运行机制进行了详细的分析,本篇来分析上一篇 ...

  5. ASP.NET MVC 自定义路由中几个需要注意的小细节

    本文主要记录在ASP.NET MVC自定义路由时,一个需要注意的参数设置小细节. 举例来说,就是在访问 http://localhost/Home/About/arg1/arg2/arg3 这样的自定 ...

  6. 理解ASP.NET MVC Framework Action Filters

    原文:http://www.cnblogs.com/darkdawn/archive/2009/03/13/1410477.html 本指南主要解释action filters,action filt ...

  7. ASP.NET MVC的Action Filter

    一年前写了一篇短文ASP.NET MVC Action Filters,整理了Action Filter方面的资源,本篇文章详细的描述Action Filter.Action Filter作为一个可以 ...

  8. Spring MVC之Action输入参数

    第一部分:Action输入参数Spring MVC 通过@RequestMapping注解映射请求,最终的真正执行代码为处理器方法,即@RequestMapping注解的方法.Spring MVC方法 ...

  9. Asp.net mvc 中Action 方法的执行(二)

    [toc] 前面介绍了 Action 执行过程中的几个基本的组件,这里介绍 Action 方法的参数绑定. 数据来源 为 Action 方法提供参数绑定的原始数据来源于当前的 Http 请求,可能包含 ...

随机推荐

  1. js json转url参数

    var json = { sh: '上海' } var params = Object.keys(json).map(function (key) { // body... return encode ...

  2. 三星 S4 手机误删除相片(相册)后的恢复问题,仅记录处理过程,其它Android手机同样适用

    无意中删除了三星S4手机中相机的相册.过程是这样的,用手机拍了几张照片,觉得最后那张拍得不好,想删除,于是进入相册,看到有那张照片的图标,选择,删除,悲剧发生了! 这里得说三星的不好:在相册中,相册文 ...

  3. sql 优化 -- sql中的自定函数

    Long run sql: MERGE INTO INTITMRTNPARAM D USING ( SELECT A.INRFILENM,A.INRSTAT,A.INRDEPCD,A.INRITMCD ...

  4. ssh转发

    ssh有3种转发:本地转发,远程转发,动态转发. 1.本地转发:当client和ssh-client的方向一致的时候,就是本地转发. 限制:1)client直接访问server被防火墙阻挡.2)ssh ...

  5. Cowboy实例

    这个例子主要是用cocos2d-x引擎自带的资源 cocos2d-x-2.2.2\samples\Cpp\TestCpp\Resources\armature 新建工程之后 #include &quo ...

  6. 银联在线支付B2C UnionPay.NET

    新春即将来临,首先给大家拜个早年,祝攻城狮们新年快乐.万事如意.合家欢乐.团团圆圆.幸福健康.来年更能大展宏图 实现各自的梦想! 同时预祝各大科技公司大佬们事业蒸蒸日上.公司转型突破创新.冲出突围带领 ...

  7. linux命令(39):shell 打印偶数行,奇数行 ,行号

    awk 命令: 1. 打印行号和内容: awk '{print NR":"$0}' 2. 输出:偶数行和奇数行到文件 awk '{print $0.txt > NR%2.tx ...

  8. 【delphi】delphi操作sqlite3

    SQLite SQLite是一个老牌的轻量级别的本地文件数据库,完全免费且开源,不需要安装,无须任何配置,当然,这样管理功能就不是很强大了,但是它的主要应用也是在本地数据库,可以说是最简单好用的嵌入式 ...

  9. 【Gtk】feorda下gtk安装详解

    feorda下gtk安装详解   1.yum在线安装gtk 1)pkg-config -version查看pkg-config的版本(本机测试是0.25)    2)安装必要组建:(在root权限下) ...

  10. LeetCode: Gas Station 解题报告

    Gas Station There are N gas stations along a circular route, where the amount of gas at station i is ...