ActionResult

Http是一个单纯采用请求/回复消息交换模式的网络协议,Web服务器在接收并处理来自客户端的请求后悔根据处理结果对请求予以回应。一般来说针对请求的处理最终体现在对目标Action方法的执行上,在定义Action方法中人为的控制对请求的响应。

namespace System.Web.Mvc{

public abstract class Controller{

         public HttpResponseBase Response { get; }

public HttpContextBase HttpContext { get; }

}

原则上任何类型的响应都可以利用当前HttpResponse来实现,但是一般并不这么做,而是将针对请求的响应实现在一个ActionResult对象

namespace System.Web.Mvc{

    //     表示操作方法的结果。

    public abstract class ActionResult{

        // 摘要:通过从 System.Web.Mvc.ActionResult 类继承的自定义类型,启用对操作方法结果的处理。

        // 参数:context:

        //  用于执行结果的上下文。上下文信息包括控制器、HTTP 内容、请求上下文和路由数据。

        public abstract void ExecuteResult(ControllerContext context);

     }

}

ActionResult就是Action执行的结果。ActionInvoker在完成对Action方法的执行后,如果返回一个ActionResult对象,ActionInvoker会将当前ControllerContext作为参数调用其ExcuteResult()。View的最终呈现时通过ActionResult的子类ViewResult来完成,除了ViewResult,ASP.NET MVC还定义了一些额外的ActionResult:

EmptyResult

ContentResult

FileResult

JavaScriptResult

JsonResult

HttpStatusCodeResult

RedirectResult/RedirectToRouteResult

 

EmptyResult:

顾名思义...不具有返回值或者返回值为NULL

ContentResult:

采用字符串响应内容,可以通过ContentEncoding、ContentType控制采用的字符串编码方式和媒体类型

FileResult:

针对文件的响应由两种方式:内联(Inline)、附件(Attachment);前者通过浏览器直接打开,后者会独立的下载到客户端;可以通过FileDownloadName属性指定文件名如果采用附件的形式,需要为响应报文头中的Content-Disposition属性赋attachment,其实return File时就已经被赋值了。

public FileResult AR1() {

            Stream stream = System.IO.File.OpenRead(@"d:temp\1.jpeg");

            return File(stream,"image/jpeg");

  }

备注

1、使用File的时候不需要using

2、如果使用File类需要写清全路径

3、注意File类的命名空间

FileResult的子类:FilePathResult、FileContentResult、FileStreamResult

在使用中不需要实例化子类,因为Controller已经提供了File的重载

FilePathResult:直接将磁盘上的文件发送到服务器。

//指定文件名上传到服务器

  public ActionResult FilePathDownload(){

            var path = Server.MapPath("~/Files/浮云.zip");

            var name = Path.GetFileName(path);

            return File(path, "application/x-zip-compressed", Url.Encode(name));

 }

FileContentResult:FileContentResult 可以直接将 byte[] 以文件形式发送至浏览器(而不用创建临时文件)

FileStreamResult:以Stream的形式从服务器读取数据并返回。没有想到它的实际用途。

 

JavaScriptResult:

在服务端动态生成一段js脚本,并以此作为请求的响应。但其实这样并不好违反了分层的原则

JsonResult:

当浏览器访问某个Action并希望以json格式返回数据时通过JsonResult。

序列化过程是通过System.Web.Script.Serialization.JavaScriptSerializer完成的。

JsonResult默认情况下不支持GET请求的响应(避免CSRF攻击),,可以通过JsonRequestBehavior属性开启GET请求的访问。但并不支持。

默认的序列化长度4MB,默认层级100,可以通过MaxJsonLength与RecursionLimit修改

JavaScriptSerializer一如既往的对DataTime类型支持的非常不好,解决方案可以把时间类型改为字符串类型

另外如果遇到循环引用时就无法序列化了。

HttpStatusCodeResult:

返回一个Http状态的响应

HttpNotFountResult:404

HttpUnauthorizedResult:授权失败时返回

RedirectResult/RedirectToRouteResult:

重定向,最终就是调用response.Redirect()

用法:return Redirect(“...”);

备注:尽量不要new Redirect()

关于View和Redirect的区别

return View("F1")与服务器只发生一次交互,当请求Index时直接返回View("F1")

return RedirectToAction("F1")与服务器发生2次交互,当请求Index是先到Index然后转向F1

1、Redirect让浏览器重定向到新的地址;return View直接让服务器把指定的cshml的内容运行渲染后给到浏览器

2、redirect浏览器和服务器之间发生了两次交互;return View浏览器和服务器之间发生了1次交互

3、Redirect由于是两次请求,所以第一次设置的ViewBag等这些信息,在第二次是娶不到的;而View则是在同一个请求中,所以View信息可以取到

4、如果用Redirect,则由于是新的对Controller/Action的请求,所以对应的Action会被执行。如果用View则是直接拿到视图去显示,对应的Action是不执行的。

什么情况用View?服务端产生数据时,想让一个视图去显示的。

什么情况用Redirect?让浏览器去访问另一个页面的时候

View的呈现(一)ActionResult的更多相关文章

  1. Asp.Net MVC<八>:View的呈现

    ActionResult 原则上任何类型的响应都可以利用当前的HttpResponse来完成.但是MVC中我们一般将针对请求的响应实现在一个ActionResult对象中. public abstra ...

  2. 白话学习MVC(十)View的呈现二

    本节将接着<白话学习MVC(九)View的呈现一>来继续对ViewResult的详细执行过程进行分析! 9.ViewResult ViewResult将视图页的内容响应给客户端! 由于Vi ...

  3. 白话学习MVC(九)View的呈现一

    一.概述 本节来看一下ASP.NET MVC[View的呈现]的内容,View的呈现是在Action执行之后进行,Action的执行生成一个ActionResult,[View的呈现]的功能就是:通过 ...

  4. Asp.net mvc 中View 的呈现(二)

    [toc] 上一节介绍了 Asp.net mvc 中除 ViewResult 外的所有的 ActionResult,这一节介绍 ViewResult. ViewResultBase ViewResul ...

  5. MVC从Controller到View的呈现

    图说MVC底层运行机制: 当路由机制已经激活Controller并InvokeAction后,如果返回的是View, 则ViewResult基于View呈现的请求响应机制内部借助MVC提供的View引 ...

  6. Asp.net mvc 中View的呈现(一)

    [toc] 我们知道针对客户端的请求,最终都会转换为对 Controller 中的一个 Action 方法的调用,指定的 Action 方法会返回一个 ActionResult 类型的实例来响应该请求 ...

  7. Artech的MVC4框架学习——第八章View的呈现

    总结:定义在controller中的action方法一般会返回actionResult的对象对请求给予 响应.viewResult是最常见也是最重要的ActionView的一种(p411).view模 ...

  8. MVC4 View 的呈现

    一 ActionResult: 1. EmptyResult: Action方法返回的ActionResult对象被ActionInvoker 调用以实现对当前请求的响应,不论Action方法是否具有 ...

  9. View的呈现(二)加载流程

    这块涉及到Code+Razor模板=>html[output流] 而这块的问题在于Razor最后生成了什么?--对象:一个类文件:eg:index.cshtml  => index_cst ...

随机推荐

  1. Delphi中上指定进程(进程名)

    procedure KillProcess(ExeName: string); const PROCESS_TERMINATE = $0001; //进程的PROCESS_TERMINATE访问权限 ...

  2. spring框架学习(三)junit单元测试

    spring框架学习(三)junit单元测试 单元测试不是头一次听说了,但只是听说从来没有用过.一个模块怎么测试呢,是不是得专门为一单元写一个测试程序,然后将测试单元代码拿过来测试? 我是这么想的.学 ...

  3. 图像切换器(ImageSwitcer)的功能与用法

    ImageSwitcher继承了VewSwitcher,因此它具有与ViewSwitcher相同的特征,可以在切换View组件时使用动画效果.ImageSwitcher继承了ViewSwitcher并 ...

  4. MFC中在基于对话框的窗体中使用CFileDialog导致菜单栏变灰的解决方案

    CSDN的博客编辑器实在是难用……转战博客园 直接把CSDN发的搬过来了 ————————————————————————————我是分割线———————————————————————————— 第 ...

  5. Java线程:锁

    一.锁的原理 Java中每个对象都有一个内置锁,当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行的代码类的当前实例(this实例)有关的锁.获得一个对象的锁也称为获取锁.锁 ...

  6. Redis缓存数据之简单逻辑

    并发不高的情况: 读: 读redis->没有,读DataBase->把DB数据写回redis,有的话直接从redis中取: 写: 写DataBase->成功,再写redis: 并发高 ...

  7. jsp+servlet+javaBean+Dao

    一.Servlet程序各模块介绍1.JSP 用于显示.收集数据的部分.2.Servlet 用于验证数据.实例化JavaBean.调用DAO连接数据库.控制页面跳转3.DAO 用于连接数据库及进行数据库 ...

  8. 不常见但很有用的chrome调试工具使用方法

    前面的话   对于chrome调试工具,常用的是elements标签.console标签.sources标签和network标签.但实际上,还有一些不太常见但相当实用的方法可以提高网页调试效率.本文将 ...

  9. Omi原理-Hello Omi

    Hello Omi Omi框架的每个组件都继承自Omi.Component,本篇会去完成Omi的Component的基本锥形,让其能够渲染第一个组件. omi.js实现 var Omi = {}; O ...

  10. 一个想法(续三):一份IT技术联盟创业计划书,开启众筹创业征程

    写在创业计划书之前的话: 昨天在闪存里我@了dudu,说:我要借钱,不久dudu回了我:傍个富婆. 当然,dudu以为我是玩笑,其实,我的确是开玩笑的,哈. 不过我正在执行一个创业计划,如果启动,我会 ...