自定义JsonResult解决 序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用

接上篇的问题,给出我自己的解决方案。

同时推荐要学习MVC的可以参考下《ASP.NET MVC4 框架揭秘》。

首先,要自定义JSonResult,就要明白MVC中 JsonResult的定义。源码要自己查了,这里就不罗嗦了。

有一点要知道的就是MVC中的JsonResult是通过JavascriptSerializer(System.Web.Scripts.Serialization.JavaScripteSerializer,要添加System.Web.Extensions.dll)来实现Json序列化和方序列化的。

现在我们要做的就是改变JsonResult序列化Json的方式,改用Json.net,利用Json.net的JsonIgnoreAttribute可以排除掉不用序列话的成员,思想和上篇中第一个解决方案一样,只要需要的字段。

上代码

    public class CustomJsonResult : JsonResult
    {
        public override void ExecuteResult(ControllerContext context)
        {

            if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet && string.Compare(context.HttpContext.Request.HttpMethod, "Get", true) == 0)
            {
                throw new InvalidOperationException();
            }
            HttpResponseBase response = context.HttpContext.Response;
            response.ContentType = string.IsNullOrEmpty(this.ContentType) ? "application/json" : this.ContentType;
            if (this.ContentEncoding != null)
            {
                response.ContentEncoding = this.ContentEncoding;
            }
            if (null != this.Data)
            {
               response.Write(JsonConvert.SerializeObject(this.Data));
            }
        }
    }
       public JsonResult GetColleges()
        {
            List<Models.CollegeInfoModel> list = collegeObj.GetAllModel();
            string data = Common.JsonConverter.List2Json<CollegeInfoModel>(list);
            Common.CustomJsonResult jr = new Common.CustomJsonResult();
            jr.Data = list;// Common.JsonConverter.Json2List<CollegeInfoModel>(data);
            jr.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
            jr.ContentType = "application/json";
            jr.ContentEncoding = System.Text.Encoding.UTF8;
            
            return jr;
        }
posted @ 2013-07-25 13:17  ML Guo  阅读(2425)  评论(0编辑  收藏  举报