LUKIYA'S NEVERLAND

春去秋来,花谢花开。


最近在做公司的一个Dealer WHOLE SALE系统,使用了Entity Framework MVC3,在返回JsonResult时遇到了循环引用的问题。

刚开始使用 [ScriptIgnore] 来避免此问题,可是发现Designer.cs改动时会把这个属性给自动删除,继续查阅了很多资料,自定义了一个JavaScriptConverter解决了问题,下面是代码。

 

  public class EFJavaScriptConverter : JavaScriptConverter
  {
    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
    {
      throw new NotImplementedException();
    }

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
    {
      IDictionary<string, object> result = new Dictionary<string, object>();
      //
      Type type = obj.GetType();
      PropertyInfo[] properties = type.GetProperties();
      foreach (PropertyInfo property in properties)
      {
        bool allowSerialize = IsAllowSerialize(property);
        if (allowSerialize)
        {
          result[property.Name] = property.GetValue(obj, null);
        }
      }
      //
      return result;
    }

    private bool IsAllowSerialize(PropertyInfo property)
    {
      object[] attrs = property.GetCustomAttributes(true);
      foreach (object attr in attrs)
      {
        if (attr is System.Data.Objects.DataClasses.EdmScalarPropertyAttribute)
        {
          return true;
        }
      }
      //
      return false;
    }

    public override IEnumerable<Type> SupportedTypes
    {
      get
      {
        yield return typeof(System.Data.Objects.DataClasses.EntityObject);
      }
    }
  }

使用方法:

IList<OLX_Users> list = _MembershipService.GetUsers();

System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer();
js.RegisterConverters(new List<EFJavaScriptConverter>() { new EFJavaScriptConverter() });

string content = js.Serialize(list);

return new ContentResult { Content = content, ContentType = "application/json" };