Ajax请求数据响应格式,一个醒目组必须是赞成的,前端才知道怎么应付,还有不少其余状况,好比异常了,有ExceptionFilter,按照固定格式返回,好比没有权限,Authorization,按照固定格式返回。html
Http请求的本质:前端
请求--应答式,响应能够那么丰富?不一样的类型其实方式同样的,只不过有个ContenetType的差异,html--text/html、json--application/json、xml/application/xml、js--application/JavaScript、ico--image/x-icon、image/gif、image/jepg、image/png.....json
这个等因而Http协议约定,Web框架和浏览器共同支持的。其实就是服务器告诉浏览器如何处理这个数据,从页面下载pdf或者页面展现pdf靠的就是ContentType,application/pdf、application/octet-stream。浏览器
MVC各类Result的事,JsonResult实际上就是JsonResult,继承ActionResult,而后重写ExecuteResult方法,指定ContentType为application/json,而后将Data序列化成字符串写入stream,咱们能够随意扩展,只须要把数据放到response,指定好ContentType服务器
ContentType对照表:http://tool.oschina.net/commonsapp
/// <summary> /// 返回ActionResult--MVC框架会执行其ExecuteResult方法--- /// </summary> /// <returns></returns> public JsonResult JsonResultIn() { return Json(new AjaxResult() { Result = DoResult.Success, DebugMessage = "这里是JsonResult" }, JsonRequestBehavior.AllowGet); }
好比咱们如今来扩展个NewtonJsonResult框架
public class NewtonJsonResult : ActionResult { private object Data = null; public NewtonJsonResult(object data) { this.Data = data; } public override void ExecuteResult(ControllerContext context) { HttpResponseBase response = context.HttpContext.Response; response.ContentType = "application/json"; response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(this.Data)); } }
调用的时候:ide
/// <summary> /// 返回ActionResult--MVC框架会执行其ExecuteResult方法--- /// </summary> /// <returns></returns> public NewtonJsonResult JsonResultNewton() { return new NewtonJsonResult(new AjaxResult() { Result = DoResult.Success, DebugMessage = "这里是JsonResult" }); }
AjaxResult:this
public class AjaxResult { public AjaxResult() { } public string DebugMessage { get; set; } public string PromptMsg { get; set; } public DoResult Result { get; set; } public object RetValue { get; set; } public object Tag { get; set; } } public enum DoResult { Failed = 0, Success = 1, OverTime = 2, NoAuthorization = 3, Other = 255 }
自定义扩展XMLResultspa
/// <summary> /// 自定义扩展XML格式result /// </summary> public class XmlResult : ActionResult { private object _data; public XmlResult(object data) { _data = data; } public override void ExecuteResult(ControllerContext context) { var serializer = new XmlSerializer(_data.GetType()); var response = context.HttpContext.Response; response.ContentType = "text/xml"; serializer.Serialize(response.Output, _data); } }
public XmlResult XmlResult() { return new XmlResult(new AjaxResult() { Result = DoResult.Success, DebugMessage = "这里是JsonResult" }); }
如今,咱们不写返回值,直接写入stream
/// </summary> public void JsonResultVoid() { HttpResponseBase response = base.HttpContext.Response; response.ContentType = "application/json"; response.Write( Newtonsoft.Json.JsonConvert.SerializeObject(new AjaxResult() { Result = DoResult.Success, DebugMessage = "这里是JsonResult" })); }