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: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据 ...
随机推荐
- 039 DataFrame的理解
1.构成 由RDD+Schema构成 RDD: DataFrame中的数据 ===> df.rdd Schema: RDD中数据的结构 ===> df.schema df是dataFram ...
- P1757 通天之分组背包
P1757 通天之分组背包背包中的经典问题,我竟然不知道.分组背包就是每个物品有一个所属的小组,小组内的物品会冲突.就是把01背包中的两个for换一下位置01:for(i,1,kind) for(j, ...
- 前端页面重构技巧总结TIP【持续更新...】
本文均为项目实战经验,要求兼容至IE8,所以以下内容均为兼容代码,欢迎各位小伙伴批评指教.其实重构页面是一门学问,看似简单,却暗藏很多学问.实际项目中页面的重构有以下几点最基本需求: 1.需要使用合理 ...
- tornado登陆装饰器
tornado作为鼎鼎大名的web异步框架,用来作为高性能服务器以及web框架都是首选.自从python3.4加入了asyncio原生协程后,tornado的最新版本也开始使用了原生的协程.定义协程函 ...
- MOXA的Nport5600初始密码
今天第一次弄Nport,看了半天手册没找到初始密码,网上也搜不到,按照说明书上想打电话问问,发现根本是空号... 后来灵感一来试了一下,居然是:moxa
- react比较入门的小demo
什么是jsx? JSX是JavaScript XML 这两个单词的缩写,xml和html非常类似,简单来说可以把它理解成使用各种各样的标签,大家可以自行 百度.所以jsx就是在javascri ...
- Cdq分治整体二分学习记录
这点东西前前后后拖了好几个星期才学会……还是自己太菜啊. Cdq分治的思想是:把问题序列分割成左右两个,先单独处理左边,再处理左边对右边的影响,再单独处理右边.这样可以消去数据结构上的一个log,降低 ...
- Codeforces Round #374 (Div. 2) B. Passwords 贪心
B. Passwords 题目连接: http://codeforces.com/contest/721/problem/B Description Vanya is managed to enter ...
- CentOS下的apache配置支持php
修改Apache的配置文件httpd.conf(vi /etc/httpd/conf/httpd.conf) DirectoryIndex index.html index.php #添加index. ...
- resteasy经验谈
resteasy 是java体系中比较成熟的rest框架,也是jax-rs规范的实现之一,dubbox的REST服务框架,就是采用的resteasy实现,近日在实际项目中遇到了几个问题,记录于此: ...