Telerik MVC Grid with Ajax Binding using EntityObjects gets Circular References exception

前端 未结 4 747
说谎
说谎 2021-02-06 15:48

I have been using Telerik MVC Grid for quite a while now and It is a great control, however, one annoying thing keeps showing up related to using the grid with Ajax Binding to o

4条回答
  •  夕颜
    夕颜 (楼主)
    2021-02-06 16:20

    I have taken a slightly different approach which I believe might be a little easier to implement.

    All I do is apply an extended [Grid] attribute to the grid json returning method instead of the normal [GridAction] attribute

    public class GridAttribute : GridActionAttribute, IActionFilter
      {    
        /// 
        /// Determines the depth that the serializer will traverse
        /// 
        public int SerializationDepth { get; set; } 
    
        /// 
        /// Initializes a new instance of the  class.
        /// 
        public GridAttribute()
          : base()
        {
          ActionParameterName = "command";
          SerializationDepth = 1;
        }
    
        protected override ActionResult CreateActionResult(object model)
        {    
          return new EFJsonResult
          {
           Data = model,
           JsonRequestBehavior = JsonRequestBehavior.AllowGet,
           MaxSerializationDepth = SerializationDepth
          };
        }
    }
    

    and

    public class EFJsonResult : JsonResult
      {
        const string JsonRequest_GetNotAllowed = "This request has been blocked because sensitive information could be disclosed to third party web sites when this is used in a GET request. To allow GET requests, set JsonRequestBehavior to AllowGet.";
    
        public EFJsonResult()
        {
          MaxJsonLength = 1024000000;
          RecursionLimit = 10;
          MaxSerializationDepth = 1;
        }
    
        public int MaxJsonLength { get; set; }
        public int RecursionLimit { get; set; }
        public int MaxSerializationDepth { get; set; }
    
        public override void ExecuteResult(ControllerContext context)
        {
          if (context == null)
          {
            throw new ArgumentNullException("context");
          }
    
          if (JsonRequestBehavior == JsonRequestBehavior.DenyGet &&
              String.Equals(context.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
          {
            throw new InvalidOperationException(JsonRequest_GetNotAllowed);
          }
    
          var response = context.HttpContext.Response;
    
          if (!String.IsNullOrEmpty(ContentType))
          {
            response.ContentType = ContentType;
          }
          else
          {
            response.ContentType = "application/json";
          }
    
          if (ContentEncoding != null)
          {
            response.ContentEncoding = ContentEncoding;
          }
    
          if (Data != null)
          {
            var serializer = new JavaScriptSerializer
            {
              MaxJsonLength = MaxJsonLength,
              RecursionLimit = RecursionLimit
            };
    
            serializer.RegisterConverters(new List { new EFJsonConverter(MaxSerializationDepth) });
    
            response.Write(serializer.Serialize(Data));
          }
        }
    

    Combine this with my serializer Serializing Entity Framework problems and you have a simple way of avoiding circular references but also optionally serializing multiple levels (which I need)

    Note: Telerik added this virtual CreateActionResult very recently for me so you may have to download the latest version (not sure but I think maybe 1.3+)

提交回复
热议问题