在讲述动作结果之前我们先看看ASP.NET WebForms是如何处理响应的:
context.Response.Clear();
context.Response.ContentType = "text/json";
context.Response.Write(JsonConvert.SerializeObject(dict));
context.Response.End();
或
context.Response.Redirect("../Home/Index.html");
context.Response.End();
上述代码返回了一个JSON对象到前台,跳转到首页,这种办法是可行的,但它存在几个问题:
1. 后台要必须包含详细的URL或HTML代码,这让代码难以维护。
2. 将响应直接生成输出,会让测试难以进行,为了确保输出是什么,需要创建Response对象的模仿实现。
幸好MVC的动作结果(Action Result)很好地解决了这个问题。它将“指明意图”和“执行意图”分开。首先MVC不会直接操作Response对象,而是返回一个实现了ActionResult类的对象,它描述控制器响应要完成的功能。例如:重定向,渲染一个视图,返回JSON。。
当MVC框架从动作结果接收到一个ActionResult对象时,它调用由这个对象所定义的ExecuteResult方法。然后在该动作结果的实现中处理Response对象,生成复合你意图的输出。
这是JsonResult的部分底层代码,可以看到最终调用的是Response.write()返回JSON字符串:
JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
if (this.MaxJsonLength.HasValue)
{
javaScriptSerializer.MaxJsonLength = this.MaxJsonLength.Value;
}
if (this.RecursionLimit.HasValue)
{
javaScriptSerializer.RecursionLimit = this.RecursionLimit.Value;
}
response.Write(javaScriptSerializer.Serialize(this.Data));