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。

参考:

MVC - Action和ActionResult的更多相关文章

  1. 了解ASP.NET MVC几种ActionResult的本质:JavaScriptResult & JsonResult

    在之前的两篇文章(<EmptyResult & ContentResult>和<FileResult>)我们剖析了EmptyResult.ContentResult和F ...

  2. MVC Action 返回类型

    https://www.cnblogs.com/xielong/p/5940535.html https://blog.csdn.net/WuLex/article/details/79008515 ...

  3. .NET MVC中的ActionResult

    一  摘要 本文介绍了ASP.NET MVC中的ActionResult,本节主要介绍 EmptyResult / Content Result /JavaScriptResult /JsonResu ...

  4. [转]Asp.Net大型项目实践(11)-基于MVC Action粒度的权限管理【续】【源码在这里】(在线demo,全部源码)

    本文转自:http://www.cnblogs.com/legendxian/archive/2010/01/25/1655551.html 接上篇Asp.Net大型项目实践(10)-基于MVC Ac ...

  5. 了解.net mvc实现原理ActionResult/View

    了解.net mvc实现原理ActionResult/View 上一篇了解了请求至Controller的Action过程,这篇继续看源码处理Action收到请求数据再返回ActionResult到Vi ...

  6. Mvc action间的传值

    1, Mvc action间的传值? TempData["student"] ="123" 在<走入asp.net mvc不归路>系列文章5中,介绍 ...

  7. ASP.NET MVC : Action过滤器(Filtering)

    http://www.cnblogs.com/QLeelulu/archive/2008/03/21/1117092.html ASP.NET MVC : Action过滤器(Filtering) 相 ...

  8. 《ASP.NET MVC4 WEB编程》学习笔记------.net mvc实现原理ActionResult/View

    ActionResult ActionResult是Action的返回结果.ActionResult 有多个派生类,每个子类功能均不同,并不是所有的子类都需要返回视图View,有些直接返回流,有些返回 ...

  9. mvc Action上面加 [HttpPost]

    mvc  Action上面加 [HttpPost]  意思就是这个action只能响应post请求. 如果发get请求这里是没有响应的

随机推荐

  1. 使用Guava提供的filter过滤集合

    正常情况下,我们声明一个List需要如下代码 List<String> list = new ArrayList<>(); list.add("AAA"); ...

  2. Unity3d使用经验总结 数据驱动篇

    我这里说的数据驱动,不是指某种框架,某种结构,或者某种编码方式. 我要说的,是一种开发方式. 大家都知道,U3D中,我们可以为某个对象编写一个脚本,然后将这个脚本挂在对象上,那这个对象就拥有了相应的能 ...

  3. 手把手教你用python打造网易公开课视频下载软件3-对抓取的数据进行处理

    上篇讲到抓取的数据保存到rawhtml变量中,然后通过编码最终保存到html变量当中,那么html变量还会有什么问题吗?当然会有了,例如可能html变量中的保存的抓取的页面源代码可能有些标签没有关闭标 ...

  4. js菜单默认选中

    function defaultSelected() { var curr = $("#leftTree li[onclick*='" + $("#content_ifr ...

  5. knh

    市场调研,分析—— 决定是否创业 不要再极度的沉默无言.宅.无存在感,无趣,难熬..

  6. 【管理心得之九】奉劝那些把组织“玩弄于鼓掌之间”的OL们。(别让组织看见此篇)

    场景再现====================== 会议主持    :今天把大家召集来,主要是讨论一下 架构师{林さん}辞职一事.{与会者 惊叹.惊讶..............}     会议者A ...

  7. PHP实现RESTful风格的API实例(一)

    最近看了一些关于RESTful的资料,自己动手也写了一个RESTful实例,以下是源码 目录详情: restful/ Request.php 数据操作类 Response.php 输出类 index. ...

  8. spring cvc-elt.1: Cannot find the declaration of element 'beans'解决办法

    转载自http://blog.csdn.net/legendj/article/details/9950963 今天在写spring aop示例的时候,在spring.xml文件中添加spring a ...

  9. 每天一个linux命令(17):whereis 命令

    whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和源代码文件(参数-s).如果省略参数,则返回所有信息. 和find相比,whereis查找的速度非 ...

  10. angularjs decorator

    angularjs decorator https://docs.angularjs.org/guide/decorators decorator() $provide服务提供了在服务实例创建时对其进 ...