让ASP.NET MVC页面返回不同类型的内容

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

 

 

 

这个比较多用在向客户端传送验证码图片时。

 

转载于:https://www.cnblogs.com/hnsongbiao/p/7607275.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值