使用Filter来替换Json内部实现

1:添加newtonsoft.json的引用

2:创建一个继承JsonResult的类

public class JsonNetResult : JsonResult
    {
        public JsonSerializerSettings Settings { get; private set; }
        public JsonNetResult()
        {
            Settings = new JsonSerializerSettings()
            {
                ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
                DateFormatString = "yyyy-MM-dd HH:mm:ss",
                ContractResolver = new CamelCasePropertyNamesContractResolver()
            };
        }

        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
            {
                throw new ArgumentException("context is null");
            }
            if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet
                && string.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
            {
                throw new InvalidOperationException("json get method is not allowed");
            }

            HttpResponseBase response = context.HttpContext.Response;
            response.ContentType = string.IsNullOrEmpty(this.ContentType) ? "application/json" : this.ContentType;

            if (this.ContentEncoding != null)
            {
                response.ContentEncoding = this.ContentEncoding;
            }

            if (this.Data == null)
            { 
                return;
            }

            JsonSerializer serializer = JsonSerializer.Create(this.Settings);
            serializer.Serialize(response.Output, this.Data);
        }
    }

 3:添加一个过滤器

public class JsonResultFileter : IActionFilter
    {
        public void OnActionExecuted(ActionExecutedContext filterContext)
        {
            if (filterContext.Result is JsonResult && !(filterContext.Result is JsonNetResult))
            {
                JsonResult jsonResult = (JsonResult)filterContext.Result;
                JsonNetResult netResult = new JsonNetResult();
                netResult.ContentEncoding = jsonResult.ContentEncoding;
                netResult.ContentType = jsonResult.ContentType;
                netResult.Data = jsonResult.Data;
                netResult.JsonRequestBehavior = jsonResult.JsonRequestBehavior;
                netResult.MaxJsonLength = jsonResult.MaxJsonLength;
                netResult.RecursionLimit = jsonResult.RecursionLimit;
                filterContext.Result = netResult;
            }
        }

        public void OnActionExecuting(ActionExecutingContext filterContext)
        {
            
        }
    }

 4:在Global.asax注册过滤器

//注册过滤器
            GlobalFilters.Filters.Add(new JsonResultFileter());

猜你喜欢

转载自yarenpeng.iteye.com/blog/2418351