View的呈现(一)ActionResult
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的更多相关文章
- Asp.Net MVC<八>:View的呈现
ActionResult 原则上任何类型的响应都可以利用当前的HttpResponse来完成.但是MVC中我们一般将针对请求的响应实现在一个ActionResult对象中. public abstra ...
- 白话学习MVC(十)View的呈现二
本节将接着<白话学习MVC(九)View的呈现一>来继续对ViewResult的详细执行过程进行分析! 9.ViewResult ViewResult将视图页的内容响应给客户端! 由于Vi ...
- 白话学习MVC(九)View的呈现一
一.概述 本节来看一下ASP.NET MVC[View的呈现]的内容,View的呈现是在Action执行之后进行,Action的执行生成一个ActionResult,[View的呈现]的功能就是:通过 ...
- Asp.net mvc 中View 的呈现(二)
[toc] 上一节介绍了 Asp.net mvc 中除 ViewResult 外的所有的 ActionResult,这一节介绍 ViewResult. ViewResultBase ViewResul ...
- MVC从Controller到View的呈现
图说MVC底层运行机制: 当路由机制已经激活Controller并InvokeAction后,如果返回的是View, 则ViewResult基于View呈现的请求响应机制内部借助MVC提供的View引 ...
- Asp.net mvc 中View的呈现(一)
[toc] 我们知道针对客户端的请求,最终都会转换为对 Controller 中的一个 Action 方法的调用,指定的 Action 方法会返回一个 ActionResult 类型的实例来响应该请求 ...
- Artech的MVC4框架学习——第八章View的呈现
总结:定义在controller中的action方法一般会返回actionResult的对象对请求给予 响应.viewResult是最常见也是最重要的ActionView的一种(p411).view模 ...
- MVC4 View 的呈现
一 ActionResult: 1. EmptyResult: Action方法返回的ActionResult对象被ActionInvoker 调用以实现对当前请求的响应,不论Action方法是否具有 ...
- View的呈现(二)加载流程
这块涉及到Code+Razor模板=>html[output流] 而这块的问题在于Razor最后生成了什么?--对象:一个类文件:eg:index.cshtml => index_cst ...
随机推荐
- 采用highchart js+flot+rrd生成cpu、mem状态监控图
HTML <script type="text/javascript" src="../static/js/jquery-1.8.0.min.js"> ...
- 递归编译的Makefile的实现
最近写了一个递归Makefile,目的是既可以实现子模块的单独编译,也可以不做任何修改就和整个程序的整体进行无缝衔接的编译.具体的思路是借助第三方文件,将子模块编译好的.o文件的路径自动写到confi ...
- 实现过程全纪录——自己写一个“微信朋友圈”(包括移动端与PC端)
一.朋友圈的基本单元--动态 首先定义一个自定义控件用来显示每条动态. 二.运行效果 三.核心解读 PushedMessage 有个PushIndex属性,表示发送消息的index,从0开始递增.每个 ...
- 初识Dapper
16年年底开发一个项目,拍卖的项目,对于我这个不入流的程序员来说,雪微是个挑战.程序猿这个行业就是学到老用到老吧.个人比较喜欢sql原生的写法,对EF 还是不怎么感冒,EF 虽然强大,但是用起来还不怎 ...
- (四)Hololens Unity 开发之 凝视系统
学习源于官方文档 Gaze in Unity 笔记一部分是直接翻译官方文档,部分各人理解不一致的和一些比较浅显的保留英文原文 HoloLens 有三大输入系统,凝视点.手势和声音 ~ 本文主要记录凝视 ...
- windows下安装redis以及redis扩展,设置redis为windows自启服务
windows下安装reids windows下redis下载地址:https://github.com/MSOpenTech/redis/releases. 启动redis服务:在redis目录下启 ...
- gRPC中Any类型的使用(Java和NodeJs端)
工作中要把原来Java服务端基于SpringMVC的服务改为使用gRPC直接调用.由于原Service的返回值为动态的Map类型,key值不确定,且value的类型不唯一,因此使用了protobuf ...
- 钉钉开发笔记(6)使用Google浏览器做真机页面调试
注: 参考文献:https://developers.google.com/web/ 部分字段为翻译文献,水平有限,如有错误敬请指正 步骤1: 从Windows,Mac或Linux计算机远程调试And ...
- Unity编程标准导引-2.2Unity中的基本概念
2.2Unity中的基本概念 上述介绍提到了几个概念:游戏对象.场景.资源.相机,这个小节我们来深入了解,同时进行一些实践性操作.不过首先,我们需要大概了解一下Unity的工程文件夹. 2.2.1工程 ...
- 开发mis系统的技术
一.b/s架构 b/s架构:就broser/server,浏览器/服务器的说法.服务器端要运行tomcat,提供链接数据库服务供java代码读写数据,这个可以在eclipse中配置运行.浏览器则解释j ...