2016-05-08 12 views
1

ASP.Net Web API 2を使用してREST APIを構築しています。クエリ文字列から複雑なオブジェクトを受け取るGETエンドポイントがあります。Web API 2 - 複雑なクエリ文字列にデフォルト値を設定するパラメータ

public async Task<IHttpActionResult> GetAsync([FromUri]SpendingAccountSearchParams spendingAccountSearchParams) {...} 

検索オブジェクトがNULL可能か、デフォルト値はオブジェクトのコンストラクタに移入しているのいずれかである特性をたくさん持っています。例えば:私は、クエリ文字列にパラメータのうちの少なくとも1を渡すと

public SpendingAccountSearchParams() 
{ 
    AsOfDate = DateTime.Now; 
    Skip = 0; 
    Top = 20; 
} 

はその後、私のSpendingAccountSearchParamsは、コントローラに読み込まれますオブジェクトとすべてのデフォルト値が正しく設定されています。

しかし、値のいずれも渡さないと、SpendingAccountSearchParamsオブジェクトはコンストラクタでnullになります。

クエリ文字列パラメータが渡されないと、自動的にすべてのプロパティがデフォルト値になるように強制できますか?

私はこれと同等のものをしたいが、明らかにそれが有効でないと動作しません:

public async Task<IHttpActionResult> GetAsync([FromUri]SpendingAccountSearchParams? spendingAccountSearchParams = new SpendingAccountSearchParams()) {...} 

それはdoesnの場合、私は、コントローラ内のIがnullかどうかを確認し、新しいオブジェクトを作成することができることを知っていますこれは1つのエンドポイントの1つの例に過ぎません。最終的に私は、さまざまな検索パラメータを持つエンドポイントをたくさん用意しています。すべてのエンドポイントを自動的に検索したいと思っています。

ご協力いただければ幸いです。

ありがとうございます!

+1

モデルバインダーを使用する必要があります。 – CodeNotFound

+0

Modelバインダーはなんでよく分かりませんが、もっと詳しい情報を教えてください。 – jkruer01

答えて

0

あなたはあなたがカスタムモデルバインダーを作成する必要があり、それらのすべてのために自動的に発生することを考えると、このコード

 public async Task<IHttpActionResult> GetAsync([FromUri]SpendingAccountSearchParams spendingAccountSearchParams){ 
    if(spendingAccountSearchParams==null) 
     { 
     spendingAccountSearchParams.AsOfDate=DateTime.Now; 
    spendingAccountSearchParams.Skip=0; 
    spendingAccountSearchParams.Top=20; 
    } 
    else 
    { 
    // your code 

    } 
} 
+0

ありがとうございましたが、私がオリジナルの投稿で言ったように、 "コントローラー内ではヌルをチェックして、それが存在しなければ新しいオブジェクトを作成することができますが、これは1つのエンドポイントの1つの例に過ぎません。すべてのエンドポイントの検索パラメータが異なるため、すべてのエンドポイントで自動的に検索したいと考えています」 – jkruer01

0

を試すことができます。モデルバインダーでParameter Binding in ASP.NET Web API

上に読む

、あなたはHTTPリクエスト、 アクションの説明、およびルートデータからの生の値のようなものへのアクセス権を持っています。

モデルバインダーを作成するには、IModelBinderインターフェイスを実装します。この インタフェースは、単一の方法、BindModelを定義:ここ

bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext); 

SpendingAccountSearchParamsオブジェクトの簡易モデルバインダーです。

public class SpendingAccountSearchParamsModelBinder : IModelBinder { 
    public bool BindModel(HttpActionContext controllerContext, ModelBindingContext bindingContext) { 
     if (bindingContext.ModelType != typeof(SpendingAccountSearchParams)) { 
      return false; 
     } 

     ValueProviderResult val = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     if (val == null) { 
      //create your default object 
      var result = new SpendingAccountSearchParams(); 
      bindingContext.Model = result; 
      return true; 
     } 

     //you could do other checks and add ModelState errors if needed 

     return true; 
    } 
} 

バインダーを登録する必要があります。

[ModelBinder]属性をタイプに追加できます。 Web APIは、そのタイプのすべてのパラメーターに、指定されたモデルバインダーを使用します。

[ModelBinder(typeof(SpendingAccountSearchParamsModelBinder))] 
public class SpendingAccountSearchParams 
{ 
    // .... 
} 
1

何らかの理由で、プロパティの代わりにゲッター/セッターを使用すると、何らかの理由でそのまま使用できます。

public SpendingAccountSearchParams() 
{ 
    DateTime AsOfDate { get; set; } = DateTime.Now; 
    int Skip { get; set; } = 0; 
    int Top { get; set; } = 20; 
} 
関連する問題