MVC - Action和ActionResult
Action
定义在Controller中的Action方法返回ActionResult对象,ActionResult是对Action执行结果的封装,用于最终对请求进行响应。HTTP是一个单纯的采用请求/回复消息交换模式的网络协议,Web服务器在接收并处理来自客户端的请求后会根据处理结果对请求予以响应,最终的处理体现在针对目标Action方法的执行。
public class MyController : Controller {
public ActionResult MyActionMethod() {
...
return xxx;
}
}
对Action方法的要求:
- public的实例方法,返回ActionResult类型;
- 不能是范型方法,不能被重载;
- 没有标志NonActionAttribute特性(NoAction);
对controller类的要求:
- MVC中所有的controller类必须以"Controller"后缀来命名;
public abstract class ControllerBase : IController
{
public ControllerContext ControllerContext { get; set; }
}
public abstract class Controller : ControllerBase, ...
{
public HttpResponseBase Response { get; }
public HttpContextBase HttpContext { get; }
}
- 直接利用只读的Response属性表示当前的HttpResponse对象,实现对请求的响应;
- 间接利用表示当前HTTP上下文的HttpContext属性和表示Controller上下文的ControllerContext属性获取用于响应请求的HttpResponse对象;
实际中,并不利用HttpResponse直接对请求响应,而是将请求响应实现在一个ActionResult对象中,最终的请求响应实现在抽象方法ExecuteResult()中。
HttpResponseBase response = context.HttpContext.Response
ActionResult
抽象类,ActionResult是Controller中Action的返回类型,Action方法可以返回一个直/间接从ActionResult抽象类继承的类型。默认ControllerActionInvoker调用ActionResult.ExecuteResult()方法生成请求响应结果。
namespace System.Web.Mvc {
public abstract class ActionResult {
protected ActionResult(); // 构造函数
public abstract void ExecuteResult(ControllerContext context); // 用于子类重写
}
}
EmptyResult
空结果。如果Action方法返回NULL或void,MVC将其转换成EmptyResult对象。
public class EmptyResult : ActionResult {
public EmptyResult();
public override void ExecuteResult(ControllerContext context);
}
ContentResult
用户定义的纯文本内容类型,调用Response.Write()将字符串直接向客户端输出。如果Action方法返回非ActionResult对象,MVC将简单地以返回对象的ToString()内容为基础产生一个ContentResult对象并返回。
public class ContentResult : ActionResult {
public ContentResult();
public Encoding ContentEncoding { get; set; }
public string ContentType { get; set; }
public string Content { get; set; }
public override void ExecuteResult(ControllerContext context);
}
其中,contentType是文档类型,contentEncoding是编码方式。
抽象类Controller定义多个重载方法根据指定的内容、编码方式和媒体类型创建相应的ContentResult对象:
public abstract class Controller : ControllerBase, ... {
protected ContentResult Content(string content, xxx);
protected virtual ContentResult Content(string content, string contentType, Encoding contentEncoding);
}
JsonResult
序列化的Json对象,将指定对象序列化为Json字符串,再调用Response.Write()将字符串写入到HTTP输出流。MVC将Response.ContentType设置为application/json,通过JavaScriptSerializer类将指定对象序列化为Json表示方式。默认情况下,MVC不允许GET请求返回Json结果,可将JsonRequestBehavior属性设置为AllowGet以解除限制。
public class JsonResult : ActionResult {
public JsonResult();
public Encoding ContentEncoding { get; set; }
public string ContentType { get; set; }
public object Data { get; set; }
// 指示是否允许来自客户端的 HTTP GET 请求
public JsonRequestBehavior JsonRequestBehavior { get; set; }
public override void ExecuteResult(ControllerContext context);
}
// 允许/拒绝支持对HTTP-GET请求的响应
public enum JsonRequestBehavior{ AllowGet, DenyGet }
CLR对象与Json格式字符串的序列化/反序列化过程由序列化器JavaScriptSerializer来完成:
public class JavaScriptSerializer {
public int MaxJsonLength { get; set; } // Json格式字符串
public int RecursionLimit { get; set; }
public string Serialize(object obj); // 序列化
public void Serialize(object obj, StringBuilder output);
public object Deserialize(string input, Type targetType); // 反序列化
public object DeserializeObject(string input);
}
抽象类Controller定义多个重载方法根据指定的内容、编码方式、媒体类型和JsonRequestBehavior值创建相应的JsonResult对象:
public abstract class Controller : ControllerBase, ... {
protected internal JsonResult Json(object data, xxx);
protected internal virtual JsonResult Json(object data, xxx);
}
Json
JavaScript Object Notation,轻量级的数据交换格式,是JavaScript的原生格式,采用完全独立于语言的文本格式,是理想的数据交换语言。Json是完全动态的,允许在Json的结构中间改变数据的表示方式。
- 易于编写阅读、解析生成,提升网络传输速率;
- 数据在键值对中,数据由逗号隔开,花括号保存对象,方括号保存数组;
- Json格式和XML格式可以相互转化;
JavaScriptResult
允许在服务端动态生成一段JS脚本用于客户端执行之,并以此作为请求的响应。ExecuteResult()方法将脚本内容写入当前HttpResponse,并将媒体类型设置为“application/x-javascript”。返回类型为JavaScriptResult的Action方法一般用于处理Ajax请求。
public class JavaScriptResult : ActionResult {
public JavaScriptResult();
public string Script { get; set; } // JS脚本
public override void ExecuteResult(ControllerContext context);
}
抽象类Controller中定义了一个JavaScript方法根据指定的脚本字符串创建一个JavaScriptResult对象:
public abstract class Controller : ControllerBase, ... {
protected virtual JavaScriptResult JavaScript(string script);
}
ViewResult
HTML的页面内容,用于呈现数据。由于Controller和相关Service已经处理完成业务逻辑并将结果打包成Model实体,View需要获得Model并将其转为Html。
参考:
- ActionResult参考示例; MVC - Action和ActionResult;
- EmptyResult & ContentResult; JavaScriptResult & JsonResult;
MVC - Action和ActionResult的更多相关文章
- 了解ASP.NET MVC几种ActionResult的本质:JavaScriptResult & JsonResult
在之前的两篇文章(<EmptyResult & ContentResult>和<FileResult>)我们剖析了EmptyResult.ContentResult和F ...
- MVC Action 返回类型
https://www.cnblogs.com/xielong/p/5940535.html https://blog.csdn.net/WuLex/article/details/79008515 ...
- .NET MVC中的ActionResult
一 摘要 本文介绍了ASP.NET MVC中的ActionResult,本节主要介绍 EmptyResult / Content Result /JavaScriptResult /JsonResu ...
- [转]Asp.Net大型项目实践(11)-基于MVC Action粒度的权限管理【续】【源码在这里】(在线demo,全部源码)
本文转自:http://www.cnblogs.com/legendxian/archive/2010/01/25/1655551.html 接上篇Asp.Net大型项目实践(10)-基于MVC Ac ...
- 了解.net mvc实现原理ActionResult/View
了解.net mvc实现原理ActionResult/View 上一篇了解了请求至Controller的Action过程,这篇继续看源码处理Action收到请求数据再返回ActionResult到Vi ...
- Mvc action间的传值
1, Mvc action间的传值? TempData["student"] ="123" 在<走入asp.net mvc不归路>系列文章5中,介绍 ...
- ASP.NET MVC : Action过滤器(Filtering)
http://www.cnblogs.com/QLeelulu/archive/2008/03/21/1117092.html ASP.NET MVC : Action过滤器(Filtering) 相 ...
- 《ASP.NET MVC4 WEB编程》学习笔记------.net mvc实现原理ActionResult/View
ActionResult ActionResult是Action的返回结果.ActionResult 有多个派生类,每个子类功能均不同,并不是所有的子类都需要返回视图View,有些直接返回流,有些返回 ...
- mvc Action上面加 [HttpPost]
mvc Action上面加 [HttpPost] 意思就是这个action只能响应post请求. 如果发get请求这里是没有响应的
随机推荐
- .NET中Dictionary<TKey, TValue>浅析
.NET中Dictionary<TKey, Tvalue>是非常常用的key-value的数据结构,也就是其实就是传说中的哈希表..NET中还有一个叫做Hashtable的类型,两个类型都 ...
- as3 Loader 加载资源后内存泄露无法释放的问题。
本人用Loader加载外部一个swf.之后unloadAndStop,Flash概要分析发现,内存没有被释放. 网上搜了一大堆文章,要么就是加载bitmapdata之后,自己dispose,要么就是加 ...
- Git学习笔记(10)——搭建Git服务器
本文主要记录了Git服务器的搭建,以及一些其他的配置,和最后的小总结. Git远程仓库服务器 其实远程仓库和本地仓库没啥不同,远程仓库只是每天24小时开机为大家服务,所以叫做服务器.我们完全可以把自己 ...
- Yii 框架学习--02 进阶
应用结构 入口文件 文件位置: web/index.php <?php //开启debug,应用会保留更多日志信息,如果抛出异常,会显示详细的错误调用堆栈 defined('YII_DEBUG' ...
- 大数据平台R语言web UI应用架构 设计与开发
1. 系统拓扑图 在日常业务分析中,R是非常常用的分析工具,而当数据量较大时,用R语言需要需用更多的时间来完成训练模型,spark作为大规模数据处理框架,采用内存计算,可以短时间内完成大量的数据的处理 ...
- 每天一个linux命令(26):用SecureCRT来上传和下载文件
用SSH管理linux服务器时经常需要远程与本地之间交互文件.而直接用SecureCRT自带的上传下载功能无疑是最方便的,SecureCRT下的文件传输协议有ASCII.Xmodem.Zmodem. ...
- js const
js const const 声明创建一个只读的常量.这不意味着常量指向的值不可变,而是变量标识符的值只能赋值一次. const state = { notes: [], activeNote: {} ...
- Netty学习五:Buffers
1. Netty中的缓冲 在Netty中并没有使用Java自带的ByteBuffer,而是自己实现提供了一个缓存区来用于标识一个字节序列,并帮助用户操作原始字节或者自定义的POJO. Java NIO ...
- 对HTML5新增JS Api的思考
1.为什么javascript的变量名不使用css中的命名方法,而选择使用驼峰命名法 因为在javascript中“-”表示减法,所以如果使用“-”的话会出现不必要的问题. 2.在javascript ...
- 深入理解PHP内核(十一)函数-函数的内部结构
原文链接:http://www.orlion.ga/330/ php的函数包括用户定义的函数.内部函数(print_r count…).匿名函数.变量函数($func = 'print_r'; $fu ...