2016-05-20 3 views
0

Для моего веб-сервиса ASP.NET MVC У меня есть модель, которую я возвращаю как объект JSON. Теперь в моей модели есть некоторые свойства, которые я не хочу возвращать.Свойства модели фильтрации API API

Пример модели:

class Account { 
    public int ID { get; } 
    public string Username { get; } 
    public string Password { get; } 
    //... more properties 
} 

Скажем, я только хочу, чтобы вернуть ID и Username свойства в формате JSON. Я ищу хороший способ фильтрации только этих свойств. Изменение модификатора доступа для меня не является вариантом.

Решение, о котором я мог думать, создает белый список, как показано ниже. Здесь я добавил DisplayName, что было бы неплохо, чтобы иметь возможность настраивать, но это не требуется.

class FilterProperty 
{ 
    public string PropertyName { get; } 
    public string DisplayName { get; } 

    public FilterProperty(string propertyName, string displayName) 
    { 
     PropertyName = propertyName; 
     DisplayName = displayName; 
    } 
} 

class Account 
{ 
    public static FilterProperty[] Whitelist = { 
     new FilterProperty("ID", "accountId"), 
     new FilterProperty("Username", "accountName") 
    }; 

    //... 
} 

Недостатком этого решения является: если бы я изменить имя свойства, я должен был бы изменить белый список тоже.

Могу ли я сделать эту работу или есть лучшие решения?

+0

Проверьте эту статью, написанную вокруг повышений и понижений размещения: http://odetocode.com/blogs/ Скот/Архив/2012/03/11/полн-руководство к массе присваивание-в-Asp-нетто-mvc.aspx. Особенно проверьте строго типизированные подходы, в частности, используя интерфейсы для ограничения модели. –

+0

Можете ли вы создать AccountDto, нанести туда нужные значения и просто вернуть AccountDto вместо учетной записи? – hellwd

+0

@hellwd Я пробовал это, но это удваивает количество моделей, которые у меня есть, что кажется не очень эффективным. –

ответ

1

Веб-API использует JSON.net в качестве сериализатора по умолчанию.

Вы можете добавить атрибут JSONIgnore, чтобы пропустить свойство.

public class Class 
     { 
     // included in JSON 
    public string Model { get; set; } 
    public DateTime Year { get; set; } 
    public List<string> Features { get; set; } 

    // ignored 
    [JsonIgnore] 
    public DateTime LastModified { get; set; } 
} 

В качестве альтернативы, если вам нужно игнорировать большинство свойств, вы можете использовать опцию подхода.

атрибут

Использование DataContract на классе, а затем добавить DataMember только свойства, которые вы хотите включить

[DataContract] 
public class Class 
      { 
     [DataMember] 
     public string Model { get; set; } 
     [DataMember] 
     public DateTime Year { get; set; } 
     // ignored 
     public List<string> Features { get; set; } 
     public DateTime LastModified { get; set; } 
    } 
2

Там может быть несколько решений вашей проблемы:

Создание ViewModel, имеющий только требуемые свойства в нем, и сопоставить эти свойства от оригинальной модели и вернуть, что ViewModel. Вы можете использовать библиотеку AutoMapper для сопоставления исходной модели с моделью просмотра.

Другое дело, что ASP.NET Web API использует Json.NET как значение по умолчанию форматера, поэтому, если ваше приложение просто использует только JSON как формат данных, вы можете использовать [JsonIgnore] игнорировать свойство для сериализации:

class Account { 
public int ID { get; } 
public string Username { get; } 

[JsonIgnore] 
public string Password { get; } 
//... more properties 
} 

Надеюсь, это поможет вам.

+0

Это хорошее решение для свойств черного списка, но я надеялся найти способ их белого списка. –

0

Если вы имеете дело только с наименованием, то одним из вариантов является использование оператора nameof. (Зависит от версии .NET)

class Account 
{ 
    public static FilterProperty[] Whitelist = { 
     new FilterProperty(nameof(Account.ID), "accountId"), 
     new FilterProperty(nameof(Account.Username), "accountName") 
    }; 

    //... 
} 
Смежные вопросы