自定义ActionResult实现NewJsonResult

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来实现此方法

你可能感兴趣的:(MVC,ActionResult)