一  摘要

  本文介绍了ASP.NET MVC中的ActionResult,本节主要介绍 EmptyResult / Content Result /JavaScriptResult /JsonResult /FileResult (FileContentResult ,FileStreamResult 和FilePathResult)。

  ActionResult:对于来自客户端的访问请求,最终的处理体现在针对目标Action方法的执行,我们可以在定义Action方法的时候人为地控制对请求的响应。抽象类Controller具有一个只读的Response属性表示当前的HttpResponse,我们可以直接利用它来实现对请求的响应。

   ActionInvoker 调用Action,创建相应的ActionResult对象,ActionResult是对Action执行结果的封装。ActionResult就是执行Action的结果。ActionResult是一个抽象类型,最终的请求响应实现在抽象方法ExecuteResult方法中。

     public abstract class ActionResult
{
//其他成员
public abstract void ExecuteResult(ControllerContext context);
}

二 常用的ActionResult

2.1  EmptyResult  &  ContentResult(简单)

  如果Action的执行结果是void 或者 null,ActionInvoker会创建一个EmptyResult,我们也可以自己返回EmptyResult。当我们返回一个字符串时可以设置返回值为ContentResult类型。

 //1、Empty
public EmptyResult GetEmpty()
{
//返回null或者一个空结果
return null;
//return new EmptyResult();
}
//2、Content
public ContentResult GetContent()
{
return Content("返回了一个字符串");
}

2.2  JavaScriptResult  &  JsonResult(常用于Ajax请求的)

1  JsonResult

   JsonResult 的ExecuteResult方法中通过JavaScriptSerializer对数据对象的序列化,并将序列化生成的JSON字符串作为内容对请求进行响应。

 public JsonResult GetJson()
{
List<Object> userList = new List<object>()
{
new {name="zs",age=},
new {name="ls",age=},
new {name="ww",age=}
};
//JsonResult的ExecuteResult方法使用JavaScriptSerializer序列化对象
       //下边的序列化操作不用写,mvc会自动帮我们进行序列化,当json数据很大时使用Json.net进行序列化
JavaScriptSerializer serializer = new JavaScriptSerializer();
string userListStr=serializer.Serialize(userList);return Json(new { msg = "ok", userList= userListStr}, JsonRequestBehavior.AllowGet);
}

2  JavaScriptResult

   JavaScriptResult 使我们可以在服务端动态地生成一段字符串类型的JavaScript脚本,并以此作为请求的响应。我们也可以通过指定ContentResult的媒体类型来使用Content实现和JavaScriptResult同样的效果。

    //返回Js脚本
UserInfo user = new UserInfo { Id = , Name = "刘备", Age = };
public JavaScriptResult GetJS()
{
string js =string.Format("alert('hello:{0}')", user.Name);
return JavaScript(js);
} public ContentResult GetJS2()
{
string js = string.Format("alert('hello:{0}')", user.Name);
return Content(js, "application/x-javascript");
}

2.3   FileResult(文件类型)

  ASP.NET MVC定义了三个具体的FileResult,分别是 FileContentResult、FilePathResult和FileStreamResult,这三个子类实现FileResult的WriteFile方式不同 。

  针对文件的响应具有两种形式,即 内联(Inline) 和 附件(Attachment) 。一般来说,内联会利用浏览器直接打开响应的文件,而附件会以独立的文件下载到客户端。文件响应在默认情况下采用内联的方式,如果需要采用附件的形式,需要为响应创建一个名称为Content-Disposition的报头,该报头值的格式为“attachment; filename={ FileDownloadName }”,我们一般会为下载的文件指定一个文件名,这个文件名可以通过FileResult的FileDownloadName属性来指定。

1  FileContentResult

  实现原理:  调用当前HttpResponse的OutputStream属性的Write方法直接将表示文件内容的字节数组写入响应输出流 。

  使用场景:由于FileContentResult是根据字节数组创建的,当我们需要动态生成响应文件内容(而不是从物理文件中读取)时,FileContentResult是一个不错的选择。

 //实现FileContent类的WriteFile方法
protected override void WriteFile(HttpResponseBase response)
{
response.OutputStream.Write(this.FileContents, , this.FileContents.Length);
}

2 FilePathResult

  实现原理:根据物理文件路径来创建FileResult。如下面的代码片断所示,表示响应文件的路径通过只读属性FileName表示,该属性在构造函数中被初始化。在实现的WriteFile方法中,FilePathResult直接将文件路径作为参数调用当前HttpResponse的TransmitFile实现了针对文件内容的响应。抽象类Controller同样定义了两个File方法重载来根据文件路径创建相应的FilePathResult。

 //实现FileContent类的WriteFile方法
protected override void WriteFile(HttpResponseBase response)
{
response.TransmitFile(this.FileName);
}

3  FileStreamResult

  实现原理:FileStreamResult允许我们通过一个用于读取文件内容的流来创建FileResult。如下面的代码片断所示,读取文件流通过只读属性FileStream表示,该属性在构造函数中被初始化。在实现的WriteFile方法中,FileStreamResult通过指定的文件流读取文件内容,并最终调用当前HttpResponse的OutputStream属性的Write方法将读取的内容写入当前HTTP响应的输出流中。

 public class FileStreamResult : FileResult
{
public Stream FileStream { get; }
public FileStreamResult(Stream fileStream, string contentType);
protected override void WriteFile(HttpResponseBase response)
{
Stream outputStream = response.OutputStream;
using (this.FileStream)
{
byte[] buffer = new byte[0x1000];
while (true)
{
int count = this.FileStream.Read(buffer, , 0x1000);
if (count == )
{
return;
}
outputStream.Write(buffer, , count);
}
}
}
}

4  一个简单的返回图片案例

Controller中的代码:

  public class ImageController : Controller
{
// GET: Image
public ActionResult Index()
{
return View();
}
public ActionResult GetImage(bool isDownLoad)
{
string path = Server.MapPath("/Images/aaa.png"); if (!isDownLoad)
{
//内联形式,在浏览器打开文件
return File(path, "image/jpeg");
}
else
{
//附件形式,下载文件名为“我的下载.png”
return File(path, "image/jpeg", "我的下载.png");
}
}
}

View中的代码:

@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>展示图片</h2>
<img src="@Url.Action("GetImage", "Image", new { isDownLoad = true })"/>

 注:ActionResult的子类还用ViewResult /PartialView 和  RedirectToAction /RedirectToRoute,这些会分成两篇文章进行总结。

.NET MVC中的ActionResult的更多相关文章

  1. MVC中的ActionResult

    ActionResult是控制器方法执行后返回的结果类型,控制器方法可以返回一个直接或间接从ActionResult抽象类继承的类型,如果返回的是非ActionResult类型,控制器将会将结果转换为 ...

  2. 理解ASP.NET MVC中的ActionResult

    通常我们在一个ASP.NET MVC项目中创建一个Controller的时候,Index()方法默认的返回类型都是ActionResult,通过查看UML图,ActionResult实际上是一个抽象类 ...

  3. asp.net core mvc中自定义ActionResult

    在GitHub上有个项目,本来是作为自己研究学习.net core的Demo,没想到很多同学在看,还给了很多星,所以觉得应该升成3.0,整理一下,写成博分享给学习.net core的同学们. 项目名称 ...

  4. ASP.NET MVC中多种ActionResult用法总结

    最近一段时间做了个ASP.NET MVC4.0的项目,项目马上就要结束了,今天忙里偷闲简单总结一下心得: 1. 如果Action需要有返回值的话,必须是ActionResult的话,可以返回一个Emp ...

  5. MVC中几种常用ActionResult

    一.定义 MVC中ActionResult是Action的返回结果.ActionResult 有多个派生类,每个子类功能均不同,并不是所有的子类都需要返回视图View,有些直接返回流,有些返回字符串等 ...

  6. ASP.NET MVC中常用的ActionResult类型

    常见的ActionResult 1.ViewResult 表示一个视图结果,它根据视图模板产生应答内容.对应得Controller方法为View. 2.PartialViewResult 表示一个部分 ...

  7. [转]MVC中几种常用ActionResult

    本文转自:http://www.cnblogs.com/xielong/p/5940535.html 一.定义 MVC中ActionResult是Action的返回结果.ActionResult 有多 ...

  8. MVC中几种常用的ActionResult

    一.定义 MVC中ActionResult是Action的返回结果.ActionResult 有多个派生类,每个子类功能均不同,并不是所有的子类都需要返回视图View,有些直接返回流,有些返回字符串等 ...

  9. .Net Mvc学习——ASP.NET MVC中常用的ActionResult类型

    一.定义 MVC中ActionResult是Action的返回结果.ActionResult 有多个派生类,每个子类功能均不同,并不是所有的子类都需要返回视图View,有些直接返回流,有些返回字符串等 ...

随机推荐

  1. Beta阶段敏捷冲刺一

    一.举行站立式会议 1.当天站立式会议照片一张 2.团队成员报告 林楚虹 (1) 昨天已完成的工作:查找连接数据库有关资料,请教在上一轮已经连接成功的同学 (2) 今天计划完成的工作:连接上数据库 ( ...

  2. WIN10基于Hyper-V下运行kubernetes入门问题

    http://www.cnblogs.com/shanyou/p/8503839.html 安装配置好之后启动,查看ip的方法: minikube status minikube ip 查看仪表盘da ...

  3. CentOS 7 Install Adobe Flash Player

    From Officail Adobe Flash Site don't down (YUM )adobe-release-x86_64-1.0-1.noarch.rpm,but to downloa ...

  4. Fantacy团队周四站立会议

    词频分析模型 1.会议时间:2016年3月31日12:07~12:30. 持续时长:23分钟 会议参加成员:组长:杨若鹏 http://www.cnblogs.com/robinYangRP/ 组员: ...

  5. c3算法详解

    c3 算法求某一类在多继承中的继承顺序:类的mro == [类] + [父类的继承顺序] + [父类2的继承顺序]如果从左到右的第一个类在后面的顺序中出现,那么就提取出来到mro顺序中[ABCD] + ...

  6. General Test Scenarios

    1 all mandatory fields should be validated and indicated by askterisk(*) symbol2 validation error me ...

  7. BZOJ3420[POI2013]Triumphal arch&BZOJ5174[Jsoi2013]哈利波特与死亡圣器——树形DP+二分答案

    题目大意: 给一颗树,1号节点已经被染黑,其余是白的,两个人轮流操作,一开始B在1号节点,A选择k个点染黑,然后B走一步,如果B能走到A没染的节点则B胜,否则当A染完全部的点时,A胜.求能让A获胜的最 ...

  8. Coding Contest HDU - 5988(费用流)

    题意: 有n个区域和m条路,每个区域有a[i]个人和b[i]个食物,然后是m条路连接两个区域,这条路容量为cap,这条路断掉的概率为p,第一个经过的时候一定不会断,后面的人有概率p会断,现在需要所有人 ...

  9. 有源汇有上下界最小流 DInic + 各种优化 模板

    例题:loj117 : https://loj.ac/problem/117 //其实就是判断可行流后倒着求一遍最大流 #include <iostream> #include <c ...

  10. FieldGroup绑定ItemDataSource

    FieldGroup可以直接绑定一个数据源DataSource.但如果想绑定某个值,并没有直接作为数据库中的一个字段存在.而是最后转为json串保存在数据库中.这样的话相当于key-value模式的D ...