簡體   English   中英

ASP.net WebApi參數從URI綁定到復雜類型

[英]ASP.net WebApi Parameter Binding to complex type from URI

我想在.net 4.5上使用ASP.net WebApi創建REST Web服務

Urls的格式應為:

/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仍然是Gender Demographics.Gender(0〜Gender.Female)的有效值。

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

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

我讀過有關類型轉換器的信息,但我必須處理URI字符串,並認為我必須實現WebApi顯然已經具有的許多功能。

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

這樣使枚舉可為空怎么樣?

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

在action方法內部,您可以僅檢查demographics.Gender是否為null。

WebAPI包含通過數據注釋的驗證框架。 這使您可以將“人口統計”對象中的性別屬性標記為[必需]:

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

然后,用[ValidateModel]屬性標記控制器或控制器方法以強制驗證(了解其他強制方法,例如,全局: 模型驗證 ):

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

此后,如果您錯過提供參數,則會得到自動驗證,並顯示一條錯誤400 Bad Request並顯示一條消息:

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

默認情況下,即使沒有必需的屬性,默認情況下也會正確處理無效值,因此,還會使用400 Bad Request消息響應提供給性別的Foo值不正確:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM