自定义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; }