Web API过滤模型属性

时间:2016-05-20 09:39:12

标签: c# asp.net json asp.net-mvc asp.net-web-api

对于我的ASP.NET MVC webservice,我有一个模型,我作为JSON对象返回。现在我的模型中有一些属性我不想返回。

示例模型:

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

假设我只想将IDUsername属性作为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")
    };

    //...
}

此解决方案的缺点是:如果我要更改属性的名称,我也需要更改白名单。

我可以做这项工作还是有更好的解决方案?

3 个答案:

答案 0 :(得分:2)

您的问题可能有多种解决方案:

创建一个ViewModel,其中包含唯一的必需属性,并从Original模型映射这些属性并返回该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
}

希望这会帮助你。

答案 1 :(得分:1)

Web 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; }
}

或者,如果您需要忽略大多数属性,可以使用opt in approach。

在您的类上使用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 :(得分:0)

如果您只关注命名,那么使用nameof运算符是一种选择。 (取决于.NET版本)

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

    //...
}