2016-12-15 3 views
2

パラメータhttp://localhost/test?TestParam1=1。しかし、クエリ文字列が空の場合、request paramはnullになり、私のメソッドにはNullReferenceExceptionが返されます。デフォルト値は、私はこのようになりますASP.NET WebAPIのアクションメソッドを持っている

WebApiに、クエリ文字列が空であっても、常にメソッドパラメータとしてnew TestRequest()のインスタンスを使用するように指示する方法はありますか?あなただけnullのためにテストする必要があり

+0

web apiに固有のカスタムバインダーを作成しないと、自動的にこれを行う方法はありません。メソッドのシグネチャで 'default(TestRequest)'を使用することを考えていた場合は、http://stackoverflow.com/a/4066357/1260204も参照してください。 – Igor

答えて

1
  1. に対するカスタムモデルバインダー定義:

    を210
  2. それを使用します。

    [HttpGet] 
    public HttpResponseMessage Test([System.Web.Http.ModelBinding.ModelBinder(typeof(TestRequestModelBinder))] TestRequest request) 
    { 
        // your code 
    } 
    
0

[HttpGet] 
public HttpResponseMessage Test([FromUri] TestRequest request) 
{ 
    if (request == null) 
     request = new TestRequest(); 
    var result = request.Process(); 
+0

これは確実に動作しますが、フレームワークに 'new TestRequest()'を呼び出す方法を探しています。すべてのAPIメソッドでnullチェックをしたくないです。 –

0

ヌルを使用してはいない右のデザインが賢明かの最も簡単な方法です。

これ以外の場合は、TestRequestタイプのカスタムモデルバインダーを使用してカスタムビヘイビアを作成できます。あなたは同じもののための例の負荷を見つけることができます。

+0

'TestRequest'だけでなく、WebAPIメソッドに渡される型に対して' new TParam() 'を呼び出すようなバインダーを作成する例を指摘できますか? –

0

パラメータリストの定数にデフォルト値を設定することができます。これは、希望通りに機能しません。

あなたは、このようにメソッドのシグネチャを持っていた場合、あなたのシナリオでは例

public HttpResponseMessage Test(string request = "ok") 

のデフォルト値を「OK」に設定することができ、IMO、最良の方法は、NULL可能、チェックなどのパラメータ値を設定することですそのコントローラで

[HttpGet] 
public HttpResponseMessage Test([FromUri] TestRequest? request) 
{ 
    if(request.HasValue) 
    { 
     //Do your thing 
    } 
} 
0

助けAndriy Tolstoyの答えは、私は、整数の性質の一部を動作させるためにかかわらず、それを少し変更しなければなりませんでした。

public class TestRequestModelBinder : IModelBinder 
{ 
    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) 
    { 
     if (bindingContext.ModelType != typeof(TestRequest)) return false; 

     bindingContext.Model = new TestRequest(); 
     var parameters = actionContext.Request.RequestUri.ParseQueryString(); 

     typeof(TestRequest) 
      .GetProperties() 
      .ToList() 
      .ForEach(property => 
      { 
       var parameterValue = parameters[property.Name]; 
       if (parameterValue == null) return; 
       typeof(TestRequest).GetProperty(property.Name).SetValue(bindingContext.Model, Convert.ChangeType(parameterValue, property.PropertyType)); 
      }); 
     return bindingContext.ModelState.IsValid; 
    } 
} 

主な変更点は、プロパティの元PropertyTypeに値をキャストすることである。ここでは

は場合にそれが誰かを助け、私が使用更新ModelBinderです。

関連する問題