簡體   English   中英

Web API過濾模型屬性

[英]Web API filtering model properties

對於我的ASP.NET MVC Web服務,我有一個返回為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")
    };

    //...
}

該解決方案的缺點是:如果我要更改屬性的名稱,則也需要更改白名單。

我可以做這項工作還是有更好的解決方案?

您的問題可能有多種解決方案:

創建一個僅具有必需屬性的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
}

希望這對您有所幫助。

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方法。

在類上使用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; }
    }

如果只考慮命名,則使用nameof運算符是一種選擇。 (取決於.NET版本)

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

    //...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM