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的实例,而是使用了一个匿名的对象初始化来仅传递那些需要的数据,如下面的代码样本所示:

  1. public ActionResult PartialJson()
  2. {
  3. var category = new ProductCategory { Name="Partial"};
  4. var result = new { Name = category.Name
  5. , ProductCount = category.Products.Count };
  6. return Json(result);
  7. }}

注意:

该方法没有直接实例化JsonResult,而是使用了Json辅助方法。本章后面将进一步讨论辅助方法。

在该样本中,所有需要的是类别名称以及该类别对应的产品计数。因此,没有串行化整个对象图表,而是取出来自实际对象的需要的信息,并将该信息存储在一个名为result的匿名类型实例中。然后,将该实例发送给响应,而不是整个对象图表。

5. JavaScriptResult

JavaScriptResult用来在客户机上执行来自服务器的JavaScript。例如,在使用内置的Ajax辅助方法发送对动作方法的请求时,方法可能只是返回一些JavaScript,它将在到达客户机时立刻执行:

  1. public ActionResult DoSomething() {
  2. script s = "$('#some-div').html('Updated!');";
  3. return JavaScript(s);
  4. }

这将通过如下的代码来调用:

  1. <%= Ajax.ActionLink("click", "DoSomething", new AjaxOptions()) %>
  2. <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控制器返回类型的更多相关文章

  1. .NET/ASP.NET MVC Controller 控制器(IController控制器的创建过程)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...

  2. 三、ASP.NET MVC Controller 控制器(二:IController控制器的创建过程)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...

  3. .NET/ASP.NET MVC Controller 控制器(深入解析控制器运行原理)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controll ...

  4. 二、ASP.NET MVC Controller 控制器(一:深入解析控制器运行原理)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controll ...

  5. ASP.NET Core WebAPI控制器返回类型的最佳选项

    前言 从.NET Core 2.1版开始,到目前为止,控制器操作可以返回三种类型的WebApi响应.这三种类型都有自己的优点和缺点,但都缺乏满足REST和高可测性的选项. ASP.NET Core中可 ...

  6. NET/ASP.NET MVC Controller 控制器(一:深入解析控制器运行原理)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controll ...

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

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

  8. ASP.NET没有魔法——ASP.NET MVC Controller的实例化与执行

    上一章节中对路由的注册和匹配过程进行了介绍,知道了MVC的Http请求最终是交由MvcHandler处理的,而其处理过程就是对Controller的创建.执行和释放. 本章将从以下几点进一步对上面提到 ...

  9. ASP.NET MVC 5 - 控制器

    MVC代表: 模型-视图-控制器 .MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据 ...

随机推荐

  1. codeM编程大赛E题 (暴力+字符串匹配(kmp))

    题目大意:S(n,k)用k(2-16)进制表示1-n的数字所组成的字符串,例如S(16,16)=123456789ABCDEF10: 解题思路: n最大50000,k最大100000,以为暴力会超时. ...

  2. 深入理解Git - 一切皆commit

    在对 git 有了基本理解和知道常规操作之后,如何对 git 的使用有进一步的理解? 一切皆 commit 或许是个不错的理解思路. 本文将从『一切皆 commit 』的角度,通过 git 中常见的名 ...

  3. webpack+vue-cli中代理配置(proxyTable)

    在做vue的项目时,用到webpack打包工具,我们会发现本地开发开启的node服务地址请求接口的地址存在跨域问题.本地开启的服务地址是 http://localhost:8080 而服务器的地址是 ...

  4. forof循环

    一.语法 1.遍历数组 let myArr=[1,2,3,4,5]; for (let ele of myArr) { console.log(ele); } let myArr=[1,2,3,4,5 ...

  5. [BZOJ3585]mex(莫队+分块)

    显然可以离线主席树,这里用莫队+分块做.分块的一个重要思想是实现修改与查询时间复杂度的均衡,这里莫队和分块互相弥补. 考虑暴力的分块做法,首先显然大于n的数直接忽略,于是将值域分成sqrt(n)份,每 ...

  6. Spring(完成毕业设计后的简单回顾)

    最近刚刚做完了毕业设计,在开发时用的是spring框架,做的时候踩了好多坑,又把当初的笔记给翻了翻,做一次简单的回顾 # 1.Spring是什么? 是一个开源的.用于简化企业级应用开发的应用开发框架. ...

  7. hdu 5775 Bubble Sort 树状数组

    Bubble Sort 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5775 Description P is a permutation of t ...

  8. [原创] 浅谈ETL系统架构如何测试?

    [原创] 浅谈ETL系统架构如何测试? 来新公司已入职3个月时间,由于公司所处于互联网基金行业,基金天然固有特点,基金业务复杂,基金数据信息众多,基金经理众多等,所以大家可想一下,基民要想赚钱真不容易 ...

  9. WAP2.0(XHTML MP)基础介绍

    (一)XHTML MP 介绍XHTML MP(eXtensible HyperText Markup Language Mobile Profile)WAP2.0与WCSS(WAP CSS /WAP ...

  10. CMSIS-DAP for STLink V2.1 and STLink v2.1 mini adapter

    CMSIS-DAP V1 V2