EasyUI 是一个轻量化,快速化,对 Ajax提供很好支持的后台界面框架,经典框架采用ASP.NET Entity + EasyUI 来进行快速开发,这中间就难免会遇到一个棘手的问题,实体模型转JSON数据,当然微软官方提供了实体转JSON的方法,我们使用using Newtonsoft.Json, 通过nuget 进行引用。但中间遇到的一个棘手的问题, 转换完成后,极端的可能下,字符串中会出现 key:null, 这样的组合,注意是 null, 不带字符串双引号。此时这样的JSON字符串返回前台绑定的时候,就会出现一片空白。
就是如上图,数据返回格式一切正常,就是前台不显示。
解决方法:写两个类,分别继承自 DefaultContractResolver 和 IValueProvider
public class NullToEmptyStringResolver : DefaultContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
return type.GetProperties().Select(p =>{var q = base.CreateProperty(p, memberSerialization);q.ValueProvider = new NullToEmptyStringValueProvider(p);return q;}).ToList();
}
}
public class NullToEmptyStringValueProvider : IValueProvider
{
PropertyInfo _MemberInfo;
public NullToEmptyStringValueProvider(PropertyInfo memberInfo)
{
_MemberInfo = memberInfo;
}
public object GetValue(object target)
{
object result = _MemberInfo.GetValue(target, null);
if (result == null)
{
result = "";
}
return result;
}
public void SetValue(object target, object value)
{
_MemberInfo.SetValue(target, value, null);
}
}
然后这两个类,在 JsonConvert.SerializeObject 转换实体的时候,对于 null 类型值,替换为字符串的""
, 转换以后就变成 key: “”, 然后前台绑定JSON就一切正常。
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Converters.Add(new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" });
settings.ContractResolver = new NullToEmptyStringResolver(); //liuwei 注意此处
return JsonConvert.SerializeObject(t, settings);