2013-07-05 42 views
1

我們有以下的ASP.NET Web API小數驗證

public class Model 
{ 
    [Required] 
    public decimal Cost { get;set; } 
} 

當我們收到一個無效的值,比如 「DASD」 或任何其他的,我返回一個錯誤請求:

public HttpResponseMessage Post(Model data) 
{ 
    if (!ModelState.IsValid) 
    { 
     return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); 
    } 

    return Request.CreateResponse(HttpStatusCode.OK); 
} 

但在響應中,json看起來像:

{ 
    "message": "The request is invalid.", 
    "modelState": { 
     "data.cost": ["Could not convert string to decimal: dasd. Path 'cost', line 1, position 181."], 
    } 
} 

首先,我該如何擺脫數據。字首?

此外,我想實現一個自定義的驗證器,像MustBeDecimal屬性,可以讓我返回更多的用戶友好的錯誤 消息。

回答

1

您可以設置在RegularExpression數據註解屬性的errormessage的。有沒有什麼理由不能使用它?

public class Model 
{ 
    [Required] 
    [RegularExpression(@"^\d+.\d{0,2}$",ErrorMessage = "You didn't enter a decimal!")] 
    public decimal Cost { get;set; } 
} 
+0

它可以用於MustBeDecimal屬性,但在嘗試將該值轉換爲十進制之前發生了一些驗證,它會引發異常,並且這是我收到的錯誤。正則表達式驗證甚至沒有被調用。 –

2

在Web API框架結合「DASD」爲十進制和它失敗,因爲它是不可能的「DASD」轉換爲十進制。顯然,綁定必須在驗證之前進行。如果更改小數字符串,結合會好起來的,你的正則表達式驗證將運行並ModelState中是無效的,但在這種情況下,那你前綴不希望存在將出席會議。

Validate方法DefaultBodyModelValidator有這個keyPrefix參數,它用於創建前綴。不幸的是,這種方法沒有標記爲虛擬的,你可以覆蓋。所以,你需要做一些像this(見第一部分)。