zoukankan      html  css  js  c++  java
  • 掌握 ActionResult

    我在上一篇博客不要停留在表面,MVC 3 我们要深入一些 说明了我们的掌握程度还是不够,还需要我们继续努力。但是有园友质疑说他们认为我说的只是书院派,并不实用,这令作为程序员的我很是生气。好吧,那咱们就一起来学习一下其中的一个知识点:ActionResult吧。希望你不是大牛,没有完全的掌握。

    ActionResult 是MVC中Action 执行之后返回的结果,我们可以通过ResultFilter 来横向的操作这些返回数据。可以说在MVC中,只要返回值不是void,或者可以这么说吧,每个Action的返回值都是ActionResult。你可能有些不服气,我怎么知道这些,怎么确定这些是正确的不是误导大家。下面我们来一个一个的看一下ActionResult的小弟们。

    上图表示的是ActionResult的家谱图,这些说明了我们可以使用的返回值类型。

    现在我们分返回值不同来讨论一下 不同的返回值

    ActionResult的执行是通过ExecuteResult(ControllerContext context)来执行。不同的子类最后 会覆盖这个方法来实现自己的业务。

    复制代码
    1 namespace System.Web.Mvc {
    2 
    3     public abstract class ActionResult {
    4 
    5         public abstract void ExecuteResult(ControllerContext context);
    6 
    7     }
    8 
    9 }
    复制代码

    借鉴Artech的那篇了解ASP.NET MVC几种ActionResult的本质:EmptyResult & ContentResult 我们可以得到action的返回值为null或者void,最后会生成EmptyResult 类型的实例。而如果返回的是普通的数据类型,例如double,string等 都会生成ContentResult 类型的实例,如果为具体的ActionResult或者子类,那么就会返回对应的ActionResult。 看到这儿可能你会有点疑惑,其实这是我在这篇博客中突出要说明的问题。就是Action的返回值问题。可以说Action的返回类型就是ActionResult的实例。

    复制代码
     1     public class TestController : Controller
     2     {
     3         //
     4         // GET: /Test/
     5 
     6         public ActionResult Index()
     7         {
     8             return View(); //返回类型为ViewResult类型
     9         }
    10 
    11         public ActionResult GetPartial()
    12         {
    13             return PartialView();//返回PartialViewResult类型    PartialViewResult 和ViewResult 有一个共同父类ViewResultBase
    14         }
    15         public void NoReturn()
    16         { 
    17         //虽然说没有返回值,但是在MVC中 确实会生成一个什么都不执行的EmptyResult类型
    18         }
    19 
    20         public ActionResult GetNull()
    21         {
    22             return null;//生成EmptyResult类型实例  其实我们这么想,只要返回值为空 就是EmptyResult
    23         }
    24 
    25         public ContentResult GetContent()
    26         {
    27             return Content("hello");//返回值类型为ContentResult
    28         }
    29 
    30         public JavaScriptResult GetJs()
    31         {
    32             return JavaScript("alert('dsdsds')");//返回值类型为Javascript 可能有时候我们直接调用这个方法 在ie中会提示下载,这是因为没有引入对应的jquery库的原因
    33         }
    34 
    35         public JsonResult GetJson()
    36         {
    37             return Json("{userName:'yuan',password:'yuan'}"); //返回值类型为jsonResult  在这里再啰嗦一句,其实返回值就已经是json,在我们通过ajax调用的时候,不需要eval解析了
    38         }
    39 
    40         public FileResult GetStream()
    41         {
    42             return File(System.Text.Encoding.UTF8.GetBytes("hello"), "text/plain"); //返回值为FileContentResult  在File方法中,第三个参数为一个downLoadName值,如果设置了,则会下载文件,如果
    43                                                                                       //不设置 ,就是在浏览器中打开 FileContentResult  FileStreamResult FilePathResult 都是如此
    44         }
    45 
    46         public HttpStatusCodeResult NotFound()
    47         {
    48             return HttpNotFound();//返回值是HttpNotFoundResult 表示的未找到文件 这是在MVC 3中新添加的HttpStatusCodeResult
    49         }
    50 
    51         public RedirectResult NotPer()
    52         {
    53             return Redirect("http://www.asp.net");//重定向 这个为临时重定向 状态码是302
    54         }
    55         public RedirectResult Per()
    56         {
    57             return RedirectPermanent("http://www.asp.net"); //永久重定向 状态吗是301
    58         }
    59 
    60     }
    复制代码

    我上面列举出了一些 常用Action的返回值类型。最重要的我还是要说可以说所有Action的返回值都是ActionResult。

    还有Action如何执行?ActionResult如何调用ExecuteResult 方法的?ViewResult的渲染?这些内容等在以后咱们慢慢叙述。但是还是那句话,只有掌握了这些,才可以灵活的运用,在基础上我们多花些时间,将来我们可能省去很多查资料的时间。

    马上公司要下班了,我也不写太多了,我再最后说明一下,

    虽然说每个ActionResult 的子类都是单独的存在,但是她们之间还是有一定的联系的,比如ContentResult就可以和JsonResult进行互换使用,所以说还需要继续努力。

    ActionResult 在表面上可以看到的内容并不多,但是有时候还是会遇到一些问题。

    返回值为JsonResult的类型本身就是json数据,不需要进行解析。

    返回值为JavascriptResult的js语句,一定要记得在页面中添加引用js。

    FileResult的三个子类,可以用来对文件进行操作,其中FilePathResult是通过 response.TransmitFile(FileName); 来实现的,在内存中没有缓存,可以输出大文件,没有断点续传功能。

    FileStreamResult是通过文件流来进行文件下载的,Stream outputStream = response.OutputStream;    outputStream.Write(buffer, 0, bytesRead); 是通过response.outputStream输出的。

    FileContentResult  是通过二进制来输出文件的。还有就是如果在File方法的第三个参数中填写了下载名称,那么就相当于下载,而不会在浏览器中显示。

    网摘自  http://www.cnblogs.com/jiagoushi/archive/2013/01/24/2875454.html

  • 相关阅读:
    1062 Talent and Virtue (25 分)
    1083 List Grades (25 分)
    1149 Dangerous Goods Packaging (25 分)
    1121 Damn Single (25 分)
    1120 Friend Numbers (20 分)
    1084 Broken Keyboard (20 分)
    1092 To Buy or Not to Buy (20 分)
    数组与链表
    二叉树
    时间复杂度与空间复杂度
  • 原文地址:https://www.cnblogs.com/lijiasnong/p/4740031.html
Copyright © 2011-2022 走看看