2013-08-07 39 views
5

我想創建一個基於.NET 4.5ASP.net的WebAPI參數綁定到複雜類型由URI

使用ASP.net的WebAPI一個REST Web服務

網址都應像這樣的格式:

/values?Age=55&Height=176&Race=1&Weight=80&Gender=male&id=800001 

相關的控制器看起來是這樣的:

[HttpGet] 
public string Get(int id, [FromUri]Demographics demographics) 
{ // etc.} 

哪裏人口統計學的是,基本上只是一個DTO具有特定屬性的自定義對象。 但是,它包含具有自定義枚舉類型的一個屬性:

enum Gender 
{ 
Female = 0, 
Male 
} 

如果URL是上述格式的默認映射工作得很好。 但是,我當然也需要檢查url提供的參數是否正確。

默認情況下,ASP.net WebApi(afaik)會根據假定的類型(或者是否可以轉換爲該類型)映射每個參數。如果它在URI中找不到匹配的值,它似乎認爲它只是0.

現在,這將我帶入一個非常不幸的情況,其中0根據定義仍然是性別Demographics.Gender(0 〜Gender.Female)。

最簡單的解決方案是更改枚舉,使0成爲我可以檢查的「不確定」狀態。但是,我無法更改枚舉。 我可以爲Demographics對象創建自己的重載,但寧願不這樣做,因爲我認爲必須有更好的方法。

我可以明確地將性別參數綁定到URI中的參數,並且如果未提交則拋出異常?

我讀過關於類型轉換器,但我將不得不在URI字符串上工作,並認爲我將不得不實現WebApi顯然已有的很多功能。

請記住,我必須處理URI並且不能使用請求正文。

回答

4

如何使這樣的枚舉爲空?

public class Demographics 
{ 
    public Gender? Gender { get; set; } 
} 

在action方法中,您可以檢查demographics.Gender是否爲null。

1

WebAPI包含通過data annotations的驗證框架。這樣就可以以標記的人口統計學的性別的屬性對象作爲[必需]:

public class Demographics 
{ 
    [Required] 
    public Gender Gender { get; set; } 
} 

然後,標記控制器或與[ValidateModel]屬性控制器方法來強制驗證(讀取關於其他的方式來強制這,例如全球:model validation):

[HttpGet] 
[ValidateModel] 
public string Get(int id, [FromUri]Demographics demographics) 
{ // etc.} 

在此之後,如果你錯過提供參數,你會得到自動驗證和具有消息的錯誤400錯誤請求:

{"Message":"The request is invalid.","ModelState":{"Gender":["The Gender field is required."]}} 

值無效的處理正確默認情況下,即使沒有必需的屬性,所以提供給性別的Foo的錯誤值也會以400錯誤請求消息響應:

{"Message":"The request is invalid.","ModelState":{"Gender":["The value 'Foo' is not valid for Gender."]}}