2017-02-15 5 views
1

次のAPIメソッド持っている:私はhttp://localhost/Customers/Search/keywordをしようとすると、C#WEBAPIは、パラメータ辞書を得ることがヌル入力エラーが含まれています

[HttpPut] 
[Route("Customers/{CustomerId}/Search", Name = "CustomerSearch")] 
[ResponseType(typeof(SearchResults))] 
public async Task<IHttpActionResult> Search([FromBody]SearchFilters filters, long? CustomerId = null) 
{ 
    //This func searches for some subentity inside customers 
} 

を以下の作品が、私はhttp://localhost/Customers/Searchをしようとすると 、私は次のエラーを取得しています:

messageDetail=The parameters dictionary contains a null entry for parameter 'CustomerId' of non-nullable type 'System.Int64' for method 'System.Threading.Tasks.Task 1[System.Web.Http.IHttpActionResult] GetById(Int64, System.Nullable 1[System.Int64])' in '....'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.

[HttpGet] 
[Route("Customers/Search/{keyword}", Name = "GetCustomersByKeyword")] 
public async Task<IHttpActionResult> SearchCustomers(string keyword = "") 
{ 
    //This func searches for customers based on the keyword in the customer name 
} 

誰もが問題を解決するためにどのように助けることができますか?または私が間違っていることを修正しますか?

答えて

1

オプションパラメータは、URLから除外できるため、テンプレートの最後に使用する必要があります。

また、顧客IDのルート制約を使用することで、キーワードが顧客IDと誤認されないようにすることができます。

参考:Attribute Routing in ASP.NET Web API 2

//PUT Customers/10/Search 
[HttpPut] 
[Route("Customers/{CustomerId:long}/Search", Name = "CustomerSearch")] 
[ResponseType(typeof(SearchResults))] 
public async Task<IHttpActionResult> Search(long CustomerId, [FromBody]SearchFilters filters,) { 
    //This func searches for some subentity inside customers 
} 

//GET Customers/Search  
//GET Customers/Search/keyword 
[HttpGet] 
[Route("Customers/Search/{keyword?}", Name = "GetCustomersByKeyword")] 
public async Task<IHttpActionResult> SearchCustomers(string keyword = "") { 
    //This func searches for customers based on the keyword in the customer name 
} 
+0

感謝。私の場合、CustomerIdは長くなるはずですか? 。それはnullableで動作しますか? –

+0

オプションパラメータの後ろにセグメントがないため、いいえ。 – Nkosi

関連する問題