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请求这里是没有响应的
随机推荐
- python sorted排序
python sorted排序 Python不仅提供了list.sort()方法来实现列表的排序,而且提供了内建sorted()函数来实现对复杂列表的排序以及按照字典的key和value进行排序. s ...
- 浅析SQL Server实现分布式事务的两阶段提交协议2PC
不久之前团队有个新人问我一个很重要的web服务接口如何保证事务的问题.因为涉及到跨库事务,当时我只是回答目前我们的SOA框架都不支持跨库事务.然后就问到了数据库跨库事务是如何实现的,我只能凭印象含糊回 ...
- paip.python错误解决23
paip.python错误解决 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net/attilax ...
- APP性能测试
方法一: 本地安装安卓模拟器,用LR选择模拟器录制方式录制 方法二: 手机真机需要root,可以在电脑上下载一键root工具(如卓大师),然后手机和电脑用数据线连接,然后root. 在手机上运行 Mo ...
- 高并发、海量数据处理尽量少使用using也能提升效率
请看下面两段: 第一种方式: MemoryStream stream = new MemoryStream(); string text = "aasasdfasdfad;sas;fkqew ...
- C# 进制转换 (没有数值的长度限制)
曾经在大学时做过一个c的进制转换算法,那时由于技术的局限性,数值的大小受到限制(系统数据类型长度限制),多年以后,自己那台学习机陈旧后感觉要报废了,整理了一下里面的东西,偶尔在一个角落里发现了这个转换 ...
- 使用uGUI制作游戏内2D动画
在3D的游戏中制作2D的效果是一个很常见的需求,我在很早前玩过一个叫做艾尔之光的游戏,里面就大量的使用了这个技术.就像下面图片中的伤害数字,这些数字往往还是有一些动画效果在里面的,比如大小的变化,颜色 ...
- poj2513Colored Sticks(无向图的欧拉回路)
/* 题意:将两端涂有颜色的木棒连在一起,并且连接处的颜色相同! 思路:将每一个单词看成一个节点,建立节点之间的无向图!判断是否是欧拉回路或者是欧拉路 并查集判通 + 奇度节点个数等于2或者0 */ ...
- PL/SQL异常处理
As we all known,程序的错误一般分为两类:编译错误和运行时错误.其中运行时错误被称为异常.PL/SQL语句块中处理异常的部分即为异常处理部分.在异常处理部分,可以指定当特定异常发生时所采 ...
- JavaScript垃圾回收(三)——内存泄露
一.JavaScript内存监测工具 在讨论内存泄露之前,先介绍几款JavaScript内存监测工具. IE的sIEve与JSLeaksDetector(这两个可以在下面的附件中下载),firefox ...