asp.net mvc Controller控制器返回类型
ASP.NET MVC包括了执行常见任务的ActionResult类型。这些类型罗列在表5-1中。每个类型都将在随后的小节中详细讨论。
表5-1 动作结果的类型及其说明
动作结果的类型 |
说 明 |
EmptyResult |
代表一个空值或空的响应。不进行任何操作 |
ContentResult |
将指定的内容作为文本直接写入响应中 |
JsonResult |
串行化提供到JSON中的对象并将 JSON写入响应中 |
RedirectResult |
将用户重新定向到给定的URL中 |
RedirectToRouteResult |
将用户重新定向到通过路由选 择参数指定的URL中 |
ViewResult |
调用进视图引擎以将视图呈现到响应中 |
PartialViewResult |
与ViewResult相似,除了没有将局部 视图呈现给响应之外,通常会响应AJAX请求 |
FileResult |
用作一组结果的基类,这组结果将二 进制的响应编写到流中。这对于将文 件返回给用户非常有用 |
FilePathResult |
继承自FileResult并返回,将文件写入 基于文件路径的响应中 |
FileContentResult |
继承自FileResult并返回,将一个字 节数组写入响应中 |
FileStreamResult |
继承自FileResult并返回,将一个 流写入响应中 |
JavaScriptResult |
用于在客户机上立刻执行来自服务 器的JavaScript代码 |
1. EmptyResult
顾名思义,这一结果用来指明架构不做任何事情。这遵循的是常见的设计模式,称作Null Object模式,它将通过一个实例替换空的引用。在该实例中,ExecuteResult方法具有一个空的实现。该设计模式在Martin Fowler的重构书中详细介绍过。更多内容参见http://martinfowler.com/bliki/refactoring.html。
2. ContentResult
这一结果将其指定的内容(通过Content属性)写入响应中。此外,这个类还支持指定内容的编码(通过ContentEncoding属性)以及内容类型(通过ContentType属性)。
如果没有指定编码,那么就使用对当前HttpResponse实例的内容编码。HttpResponse的默认编码是在web.config的全局化元素中指定的。
同样,如果没有指定内容类型,则使用当前HttpResponse实例上的内容类型设置。HttpResponse默认的内容类型是"text/html"。
3. FileResult
除了用于将二进制内容(例如,磁盘上的Microsoft Word文档或来自SQL Server中blob列的数据)写入响应中之外,该结果非常类似于ContentResult。设置结果上的FileDownloadName属性将设置Content-Disposition题头的适当值,这导致一个文件下载对话框出现在用户面前。
注意,FileResult是一个抽象基类,用于如下3个不同的文件结果类型:
FilePathResult
FileContentResult
FileStreamResult
使用方法通常遵循的是"工厂模式(factory pattern)",在该模式中,返回的具体类型取决于调用了哪一个File方法(将在随后讨论)的重载。
4. JsonResult
该结果使用JavaScriptSerializer类来将其内容(通过Data属性指定)串行化为JSON(JavaScript Object Notation)格式。对于简单的Ajax情形,如果需要一个动作方法来以一种易于为JavaScript消费的格式返回数据,那么这一结果将非常有用。
与ContentResult一样,JsonResult的内容编码和内容类型可以通过属性来设置。唯一的区别在于默认的ContentType是"application/json",而不是该结果对应的"text/html"。
注意,JsonResult串行化整个对象图表。因此,如果提供一个ProductCategory对象(含有一个20个Product实例的集合),那么还将串行化每个Product实例并将其包含到发送给响应的JSON中。现在,假设每个Product都含有一个包含了20个Order实例的Orders集合,那么可以想象,JSON响应可能迅速膨胀。
目前,尚没有方法来限制串行化成JSON的数量,这样对于含有大量属性和集合的对象(如通常由LINQ To SQL生成的对象)而言,可能就会出现问题。推荐的方法是创建一个含有具体信息的类型,这些信息就是想要包含到JsonResult中的信息。这一情形正是匿名类型派上用场的地方。
例如,在前面的情形中,没有串行化ProductCategory的实例,而是使用了一个匿名的对象初始化来仅传递那些需要的数据,如下面的代码样本所示:
- public ActionResult PartialJson()
- {
- var category = new ProductCategory { Name="Partial"};
- var result = new { Name = category.Name
- , ProductCount = category.Products.Count };
- return Json(result);
- }}
注意:
该方法没有直接实例化JsonResult,而是使用了Json辅助方法。本章后面将进一步讨论辅助方法。
在该样本中,所有需要的是类别名称以及该类别对应的产品计数。因此,没有串行化整个对象图表,而是取出来自实际对象的需要的信息,并将该信息存储在一个名为result的匿名类型实例中。然后,将该实例发送给响应,而不是整个对象图表。
5. JavaScriptResult
JavaScriptResult用来在客户机上执行来自服务器的JavaScript。例如,在使用内置的Ajax辅助方法发送对动作方法的请求时,方法可能只是返回一些JavaScript,它将在到达客户机时立刻执行:
- public ActionResult DoSomething() {
- script s = "$('#some-div').html('Updated!');";
- return JavaScript(s);
- }
这将通过如下的代码来调用:
- <%= Ajax.ActionLink("click", "DoSomething", new AjaxOptions()) %>
- <div id="some-div"></div>
这里假设引用了AJAX库和jQuery。
6. RedirectResult
该结果将执行重新指向指定URL的HTTP(通过Url属性设置)。从内部讲,该结果调用HttpResponse.Redirect方法,这将HTTP状态码设置为HTTP/1.1 302 Object Moved,导致浏览器立刻发送一个对指定URL的新请求。
从技术的角度讲,只要直接调用动作方法中的Response.Redirect,但是使用RedirectResult将该动作推迟到动作方法完成其工作之后。这在对动作方法进行单元测试时非常有用,而且帮助保持底层的架构细节位于动作方法外部。
7. RedirectToRouteResult
执行HTTP重定向的方式与执行RedirectResult的方式一样,但是不同的是,没有直接指定一个URL,这一结果使用路由选择的API来确定重定向的URL。
注意,目前有两种方便的方法(如下面定义的),RedirectToRoute和RedirectToAction,这两个方法将返回该类型的结果。
8. ViewResult
该结果是最广为使用的动作结果类型。它调用IViewEngine实例的FindView方法,返回IView的一个实例。随后,ViewResult调用IView实例上的Render方法,它将呈现响应的输出。一般来说,这将把指定的视图数据(即动作方法准备显示在视图中的数据)融入到一个模板中(该模板将对被显示的数据进行格式化)。
第6章将更详细地讨论视图的问题。
9. PartialViewResult
除了调用FindPartialView方法(而不是FindView)来定位视图之外,该结果的工作方式与ViewResult的工作方式完全相同。它用来呈现局部视图(如ViewUserControl),而且在局部更新的时候(即使用AJAX通过大块HTML更新页面部分时),它很有用。
转载:
原文地址:http://book.51cto.com/art/201006/205372.htm
asp.net mvc Controller控制器返回类型的更多相关文章
- .NET/ASP.NET MVC Controller 控制器(IController控制器的创建过程)
阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...
- 三、ASP.NET MVC Controller 控制器(二:IController控制器的创建过程)
阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...
- .NET/ASP.NET MVC Controller 控制器(深入解析控制器运行原理)
阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controll ...
- 二、ASP.NET MVC Controller 控制器(一:深入解析控制器运行原理)
阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controll ...
- ASP.NET Core WebAPI控制器返回类型的最佳选项
前言 从.NET Core 2.1版开始,到目前为止,控制器操作可以返回三种类型的WebApi响应.这三种类型都有自己的优点和缺点,但都缺乏满足REST和高可测性的选项. ASP.NET Core中可 ...
- NET/ASP.NET MVC Controller 控制器(一:深入解析控制器运行原理)
阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controll ...
- ASP.NET MVC – 关于Action返回结果类型的事儿(上)
原文:ASP.NET MVC – 关于Action返回结果类型的事儿(上) 本文转自:博客园-文超的技术博客 一. ASP.NET MVC 1.0 Result 几何? Action的 ...
- ASP.NET没有魔法——ASP.NET MVC Controller的实例化与执行
上一章节中对路由的注册和匹配过程进行了介绍,知道了MVC的Http请求最终是交由MvcHandler处理的,而其处理过程就是对Controller的创建.执行和释放. 本章将从以下几点进一步对上面提到 ...
- ASP.NET MVC 5 - 控制器
MVC代表: 模型-视图-控制器 .MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据 ...
随机推荐
- 一个ScheduledExecutorService启动的Java线程无故挂掉引发的思考
2018年12月12日18:44:53 一个ScheduledExecutorService启动的Java线程无故挂掉引发的思考 案件现场 不久前,在开发改造公司一个端到端监控日志系统的时候,出现了一 ...
- Django中的ORM关系映射查询方面
ORM:Object-Relation Mapping:对象-关系映射 在MVC框架中的Model模块中都包括ORM,对于开发人员主要带来了如下好处: 实现了数据模型与数据库的解耦,通过简单的配置就可 ...
- Redis客户端连接以及持久化数据(三)
0.Redis目录结构 1)Redis介绍及部署在CentOS7上(一) 2)Redis指令与数据结构(二) 3)Redis客户端连接以及持久化数据(三) 4)Redis高可用之主从复制实践(四) 5 ...
- mysql索引原理剖析
一.索引的原理 所谓索引,即是快速定位与查找,那么索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数(B+树相比B树,其非叶子节点占用更小的空间,可以有更多非叶子节点存放在再内存中,减少大量的IO ...
- django-QueryDict 对象
在 HttpRequest 对象中,属性 GET 和 POST 得到的都是 django.http.QueryDict 所创建的实例.这是一个 django 自定义的类似字典的类,用来处理同一个键带多 ...
- csdn 音乐 怎么拦截 提交后的程序 csdn 栏目 音乐 csdn 添加 音乐
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha csdn 栏目 音乐 csdn 添加 音乐 ======= <embed src= ...
- 牛客OI赛制测试赛3游记
A - 数字权重 题目大意: 一个\(n\)位的数字.设第\(i\)位的数为\(a_i\),其中\(a_1\)为最高位,\(a_n\)为最低位,\(k\)为给定的数字.求同时满足满足以下两个条件的数的 ...
- PHP 合理配置实现文件上传及保存文件到数据库
合理配置 php.ini 如何配置php.ini实现PHP文件上传功能.其中涉及到php.ini配置文件中的upload_tmp_dir.upload_max_filesize.post_max_si ...
- Java常用加密方案及实现——AES和DES
AES和DES都是对称加密算法,其中DES全称为Data Encryption Standard,AES全称为Advanced Encryption Standard即高级加密标准. DES现在已经不 ...
- 接口开发-集成接口文档(swagger)
在正式进入主题之前,先说说实际工作中遇到的问题.不算是传统的原生APP开发,还是眼下的H5混合开发,只要是需要前后端通过接口配合的,往往都存在几个普遍的问题 (1)接口文档谁来写,尤其是跨部门,并且, ...