zoukankan      html  css  js  c++  java
  • 让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;
            }

     

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

  • 相关阅读:
    【语言处理与Python】11.3数据采集
    【语言处理与Python】11.4使用XML\11.5使用Toolbox数据
    【语言处理与Python】11.1语料库结构:一个案例研究\11.2语料库生命周期
    【语言处理与Python】10.5段落语义层
    CentOS7.4 删除virbr0虚拟网卡
    套接字超时设置
    Linux命令进制转换、大小写转化
    网络编程第一卷读书笔记(随手记)
    linux下tcp选项TCP_DEFER_ACCEPT研究记录
    Cannot assign requested address出现的原因及解决方案
  • 原文地址:https://www.cnblogs.com/hnsongbiao/p/7607275.html
Copyright © 2011-2022 走看看