2016-05-20 2 views
0

私のASP.NET MVC Webサービスでは、JSONオブジェクトとして返すモデルがあります。今私のモデルには、私が帰りたくないいくつかのプロパティがあります。Web APIフィルタリングモデルのプロパティ

モデル例:

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

はのは私だけJSONとしてIDUsernameプロパティを返すようにしたいとしましょう。私は、これらのプロパティだけをフィルタリングするための良い方法を探しています。アクセス修飾子を変更することは私の選択肢ではありません。

私が考えることができる解決策は、以下のようなホワイトリストを作成することです。ここで私は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/をscott/archive/2012/03/11/asp-net-mvc.aspxでの完全ガイド/質量割り当て。とりわけインタフェースを使用してモデルを制限するなど、強く型付けされたアプローチをチェックしてください。 –

+0

AccountDtoを作成し、必要な値をマップして、Accountの代わりにAccountDtoを返すことはできますか? – hellwd

+0

@hellwd私はこれを試しましたが、これは私が持っているモデルの量が2倍になります。それは非常に効率的ではないと思われます。 –

答えて

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

また、ほとんどのプロパティを無視する必要がある場合は、オプトインアプローチを使用できます。

あなたのクラスの

使用のDataContract属性と、あなたが

[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演算子の使用が1つのオプションです。 (.NETバージョンに依存)

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

    //... 
} 
関連する問題