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

  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.  
  4.     return JavaScript(s);  

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

  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

 

posted @ 2015-07-31 08:59  zzli  阅读(5675)  评论(0编辑  收藏  举报