Лучший способ фильтрации доменных объектов для вывода в формате json в приложении ASP.NET MVC - PullRequest
8 голосов
/ 17 декабря 2008

Если я отображаю в asp.net mvc обычное представление, то единственные свойства объекта домена, которые отображаются на моей странице, - это те, которые я специально выписываю. Например:

<div><%= Customer.FirstName %></div>

Однако, если я сериализую доменный объект для json, он будет включать все свойства. Пример:

public JsonResult Customer (int? id)
{
    Customer customer = _serviceLayer.GetCustomer (id.Value);

    return Json (customer);
}

Поскольку я не хочу, чтобы каждое свойство Customer отображалось, каков наилучший способ фильтрации выходных свойств для json в этом случае? Можете ли вы использовать список включения / исключения, например UpdateModel ()? Использовать прокси-класс, такой как открытый класс JsonCustomer? Что бы вы порекомендовали?

Ответы [ 6 ]

19 голосов
/ 17 декабря 2008

Я использую анонимные типы для этого:

var customer = from c in serviceLayer.GetCustomers()
               where c.Id == id.Value
               select new { FirstName = c.FirstName };

Это не просто хорошая идея. Скорее, это защита от исключения, которое вы получите при вызове Json (), если ваш граф объектов содержит циклическую ссылку.

6 голосов
/ 08 октября 2009

Вы можете использовать атрибут [ScriptIgnore] (в System.Web.Extensions). См. http://www.creave.dk/post/2009/10/07/Excluding-properties-from-being-serialized-in-ASPNET-MVC-JsonResult.aspx для примера.

4 голосов
/ 01 января 2009

Пожалуйста, используйте вид модели. Модель представления - это объект, который пользовательский интерфейс использует для представления ваших доменных объектов на экране. Каждый экран имеет свою собственную модель просмотра.

Когда вы создаете модель представления, представляющую собой DTO, которая представляет собой плоскую, нулевую безопасную проекцию объектов домена, не отображайте свойства, которые вы не хотите отображать на экране.

Сериализация модели представления, а не объекта вашего домена.

1 голос
/ 17 декабря 2008

Вы можете использовать библиотеку Newtonsoft и атрибут [JsonIgnore] для маркировки свойств вашего класса, которые вы не хотите показывать. Существуют и другие библиотеки (с возможным другим свойством игнорировать имя атрибута), я лично предпочитаю эту, поскольку она очень гибкая в расширениях конвертера JSON и т. Д. + Она может легко сериализовать анонимные объекты.

public class Customer
{
    ...
    [JsonIgnore]
    public string UrlIn { get; set; }
    public string FirstName { get; set; }
    // following example of a converter, you could write your own as well
    [JsonConverter(typeof(Newtonsoft.Json.Converters.JavaScriptDateTimeConverter))]
    public DateTime Created { get { return _created; } }
}
0 голосов
/ 02 октября 2009

По моему опыту, JavaScriptSerializer учитывает некоторые атрибуты XmlSerialization, такие как XmlIgnore.

0 голосов
/ 17 сентября 2009

Я столкнулся с той же проблемой, и ОДИН РЕШЕНИЕ -

Используйте атрибут [ScriptIgnore] .. это решит проблему.

добавить ссылку на system.web.extensions и добавить пространство имен:

Использование System.Web.Script.Serialization.

Если у вас все еще есть вопросы ... Прочтите ... за некоторым подробным объяснением ..

У меня есть класс User с ..

с использованием системы;

с использованием System.Collections.Generic;

с использованием System.Linq;

с использованием System.Web;

с использованием Iesi.Collections.Generic;

с использованием System.Runtime.Serialization;

пространство имен RAPortal.Core.Entities

{

публичный класс пользователя

{

   private int _userId;

   private string _firstName;

   private string _lastName;

частные IList _applications;

   private IList<Group> _groups;

   private IList<ApplicationRequest> _applicationRequests;

.... Свойство ..

   public virtual int UserId

   {

       get

       {

           return _userId;

       }

       set

       {

           _userId = value;

       }

   }

   public virtual string Title

   {

       get

       {

           return _title;

       }

       set

       {

           _title = !String.IsNullOrEmpty(value) ? value.ToUpper().Trim() : null;

       }

   }

общедоступные виртуальные группы IList

   {

       get

       {

           return _groups;

       }

       set

       {

           _groups = value;

       }

   }

   public virtual IList<UserPrivilege> UserPrivileges

   {

       get

       {

           return _userPrivileges;

       }

       set

       {

           _userPrivileges = value;

       }

   }

   public virtual IList<UserRole> UserRoles

   {

       get

       {

           return _userRoles;

       }

       set

       {

           _userRoles = value;

       }

   }

... и так далее ...

и у меня есть класс группы ..

с использованием системы;

с использованием System.Collections.Generic;

с использованием System.Linq;

с использованием System.Web;

с использованием System.Web.Script.Serialization;

с использованием System.Runtime.Serialization;

пространство имен RAPortal.Core.Entities

{

группа публичного класса

{

   private int _groupId;

   private string _name;

   private IList<User> _users;

   public virtual int GroupId

   {

       get

       {

           return _groupId;

       }

       set

       {

           _groupId = value;

       }

   }

   public virtual string Name

   {

       get

       {

           return _name;

       }

       set

       {

           _name = !String.IsNullOrEmpty(value) ? value.ToUpper().Trim() : null;

       }

   }

   [ScriptIgnore]

   public virtual IList<User> Users

   {

       get

       {

           return _users;

       }

       set

       {

           _users = value;

       }

   }

}

}

Поскольку на пользователя ссылаются в группах ... json думает, что это круговая ссылка, и он выдаст исключение ... поэтому исправление заключается в добавлении [ScriptIgnore] поверх пользователя. И добавьте ссылку и пространство имен к этому классу, как это ..

Это решило мою проблему .. Я уверен, что есть лучшие пути там !!! Приветствия ...

И помните, что вы должны добавлять [scriptIgnore] только в классе groups, а не в классе Users.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...