Первое решение работает с режимом редактирования сетки, но у нас та же проблема с загрузкой сетки, в которой уже есть строки объектов с круговой ссылкой, и для решения этой проблемы нам нужно создать новый IClientSideObjectWriterFactory и новый IClientSideObjectWriter ,
Вот что я делаю:
1 - Создать новый IClientSideObjectWriterFactory:
public class JsonClientSideObjectWriterFactory : IClientSideObjectWriterFactory
{
public IClientSideObjectWriter Create(string id, string type, TextWriter textWriter)
{
return new JsonClientSideObjectWriter(id, type, textWriter);
}
}
2 - Создайте новый IClientSideObjectWriter, на этот раз я не реализую интерфейс, я унаследовал ClientSideObjectWriter и переопределил методы AppendObject и AppendCollection:
public class JsonClientSideObjectWriter : ClientSideObjectWriter
{
public JsonClientSideObjectWriter(string id, string type, TextWriter textWriter)
: base(id, type, textWriter)
{
}
public override IClientSideObjectWriter AppendObject(string name, object value)
{
Guard.IsNotNullOrEmpty(name, "name");
var data = JsonConvert.SerializeObject(value,
Formatting.None,
new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore,
ContractResolver = new PropertyNameIgnoreContractResolver()
});
return Append("{0}:{1}".FormatWith(name, data));
}
public override IClientSideObjectWriter AppendCollection(string name, System.Collections.IEnumerable value)
{
public override IClientSideObjectWriter AppendCollection(string name, System.Collections.IEnumerable value)
{
Guard.IsNotNullOrEmpty(name, "name");
var data = JsonConvert.SerializeObject(value,
Formatting.Indented,
new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore,
ContractResolver = new PropertyNameIgnoreContractResolver()
});
data = data.Replace("<", @"\u003c").Replace(">", @"\u003e");
return Append("{0}:{1}".FormatWith((object)name, (object)data));
}
}
ПРИМЕЧАНИЕ. Замените его, потому что сетка отображает HTML-теги для шаблона клиента в режиме редактирования, и если мы не кодируем, браузер отобразит теги. Я еще не нашел обходной путь, если не использую объект Replace from string.
3- На моем Application_Start на Global.asax.cs я зарегистрировал свою новую фабрику следующим образом:
DI.Current.Register<IClientSideObjectWriterFactory>(() => new JsonClientSideObjectWriterFactory());
И это работало для всех компонентов, которые есть у Telerik. Единственное, что я не изменил, это PropertyNameIgnoreContractResolver, который был одинаковым для классов EntityFramework.