MVC自帶的JsonResult我們想替換成使用Newtonsoft.Json的類庫來實現,我們可以自定義一個來實現。
我們通過繼承JsonResult來實現
public class NewJsonResult:JsonResult {
public override void ExecuteResult(ControllerContext context) {
if (context == null) {
throw new ArgumentException("序列化內容不能爲null");
}
if (context.HttpContext == null || context.HttpContext.Response == null) {
return;
}
if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Compare(context.HttpContext.Request.HttpMethod, "Get", true)==0) {
throw new InvalidOperationException();
}
context.HttpContext.Response.ContentType = string.IsNullOrEmpty(ContentType) ? "application/json" : ContentType;
context.HttpContext.Response.ContentEncoding = ContentEncoding == null ? System.Text.Encoding.UTF8 : ContentEncoding;
if (Data != null) {
context.HttpContext.Response.Write(JsonConvert.SerializeObject(Data));
}
}
}
這樣就實現了NewJsonResult,但是我們在Controller中調用時想仍舊像原來那樣返回一個Json()的方法,那就可以通過過濾器來實現,MVC中的ActionFilter可以實現此方法,當方法執行完後我們可以在OnActionExecuted中將實現方法改爲通過我們的NewJsonResult來實現。
public class MyJsonAttribute:ActionFilterAttribute {
public override void OnActionExecuted(ActionExecutedContext filterContext) {
//base.OnActionExecuted(filterContext);
if (filterContext.Result is JsonResult && !(filterContext.Result is NewJsonResult)) {
JsonResult jResult = (JsonResult)filterContext.Result;
NewJsonResult result = new NewJsonResult() { Data = jResult.Data, JsonRequestBehavior = jResult.JsonRequestBehavior, ContentEncoding = jResult.ContentEncoding, ContentType = jResult.ContentType };
filterContext.Result = result;
}
}
}
還需在過濾器配置文件中加上filters.Add(new MyJsonAttribute());
這樣當執行完後過濾器判斷是JsonResult就通過NewJsonResult來實現此方法