C# Web API过滤模型属性

C# Web API过滤模型属性,c#,asp.net,json,asp.net-mvc,asp.net-web-api,C#,Asp.net,Json,Asp.net Mvc,Asp.net Web Api,对于我的ASP.NET MVC Web服务,我有一个作为JSON对象返回的模型。现在我的模型中有一些属性我不想返回 一个示例模型: class Account { public int ID { get; } public string Username { get; } public string Password { get; } //... more properties } 假设我只想将ID和Username属性作为JSON返回。我正在寻找一种只过滤这些

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

一个示例模型:

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")
    };

    //...
}
这种解决方案的缺点是:如果我要更改属性的名称,我也需要更改白名单


我能做到这一点吗?还是有更好的解决方案

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

创建一个仅包含所需属性的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
}

希望这对您有所帮助。

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

创建一个仅包含所需属性的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
}

希望这对您有所帮助。

如果您只关心命名,那么使用运算符是一种选择。(.NET版本相关)


如果您只关心命名,那么使用运算符是一种选择。(.NET版本相关)


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; }
}
公共类
{
//包含在JSON中
公共字符串模型{get;set;}
公共日期时间年{get;set;}
公共列表功能{get;set;}
//忽略
[JsonIgnore]
公共日期时间LastModified{get;set;}
}
或者,如果您需要忽略大多数属性,您可以使用opt-in方法

在类上使用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; }
    }
[DataContract]
公共课
{
[数据成员]
公共字符串模型{get;set;}
[数据成员]
公共日期时间年{get;set;}
//忽略
公共列表功能{get;set;}
公共日期时间LastModified{get;set;}
}

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; }
}
公共类
{
//包含在JSON中
公共字符串模型{get;set;}
公共日期时间年{get;set;}
公共列表功能{get;set;}
//忽略
[JsonIgnore]
公共日期时间LastModified{get;set;}
}
或者,如果您需要忽略大多数属性,您可以使用opt-in方法

在类上使用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; }
    }
[DataContract]
公共课
{
[数据成员]
公共字符串模型{get;set;}
[数据成员]
公共日期时间年{get;set;}
//忽略
公共列表功能{get;set;}
公共日期时间LastModified{get;set;}
}

查看这篇文章,文章围绕以下内容撰写:。特别是检查强类型方法,特别是使用接口来限制模型。你能创建AccountDto,映射你想要的值,然后只返回AccountDto而不是Account吗?@hellwd我尝试过这个方法,但这使我拥有的模型数量增加了一倍,这似乎不是很有效使用更多的模型并不意味着增加应用程序的额外负担。这是你如何使用它们的唯一问题。只需返回一个只包含你想要的属性的匿名对象。请查看这篇文章,文章围绕以下内容撰写:。特别是检查强类型方法,特别是使用接口来限制模型。你能创建AccountDto,映射你想要的值,然后只返回AccountDto而不是Account吗?@hellwd我尝试过这个方法,但这使我拥有的模型数量增加了一倍,这似乎不是很有效使用更多的模型并不意味着增加应用程序的额外负担。这只是你如何使用它们的问题。只需返回一个只包含你想要的属性的匿名对象。这是黑名单属性的一个很好的解决方案,但我希望找到一种将它们列入白名单的方法。这是黑名单属性的一个很好的解决方案,但我希望找到一种将它们列入白名单的方法。