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请求这里是没有响应的
随机推荐
- Nodejs·网络服务
本章是从NodeJS拥有的模块角度,讲述了网络服务中的应用: net ----- > TCP dgram --> UDP http -----> HTTP https ----> ...
- Oracle使用小记
windows下Oracle必须要启动的服务 Oracle ORCL VSS Writer Service:Oracle卷映射拷贝写入服务,VSS(Volume Shadow Copy Service ...
- 20_学生选课数据库SQL语句练习题1
25.查询95033班和95031班全体学生的记录. select * from STUDENT t,SCORE s where t.sclass=95033 or t.sclass=95031 26 ...
- Lua: 好的, 坏的, 和坑爹的
好的 小巧: 20000行C代码 可以编译进182K的可执行文件 (Linux下). 可移植: 只要是有ANSI ...
- Atitit 文档资料管理同步解决方案
Atitit 文档资料管理同步解决方案 流程 生成快照, 操作. 使用快照与dir对比,生成操作日志 /atiplat_cms/src/com/attilax/sync/SyncUtil.java p ...
- css 弹出层-透明层
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- cmder设置打开时的默认目录
cmder设置打开时的默认目录 打开cmder自动进入工作目录,怎么配置? http://superuser.com/questions/1005285/run-a-bat-file-with-cmd ...
- 浏览器加载和渲染html的顺序
前阵子,在组内给大家做了一次关于“浏览器加载和渲染HTML的顺序”的分享,这里再总结一下吧. AD:干货来了,不要等!WOT2015 北京站演讲PPT开放下载! 1.浏览器加载和渲染html的顺序 浏 ...
- WPF自定义控件与样式(13)-自定义窗体Window & 自适应内容大小消息框MessageBox
一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: 自定义 ...
- hdu2066一个人的旅行(多源点多汇点的最短路径问题)
/* 思路:多源点,多会点的最短路径! 将最小号-1的节点但最源点,将最大号+1的点当作汇点! 将问题转变成从一个源点到一个汇点的最短路径的问题! 开始忘记初始化vector了,哇了好多次....坑爹 ...