1

私たちは以下を持っています

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

「dasd」などの無効な値を受け取ると、BadRequest を返します。

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 属性のようなカスタム バリデータを実装して、よりユーザー フレンドリーなエラー メッセージを返せるようにしたいと考えています。

4

2 に答える 2

3

Web API フレームワークは「dasd」を 10 進数にバインドしますが、「dasd」を 10 進数に変換できないため失敗します。明らかに、バインディングは検証の前に発生する必要があります。10 進数を文字列に変更すると、バインドは問題なく、正規表現の検証が実行され、ModelState は無効になりますが、この場合も、存在させたくないプレフィックスが存在します。

Validateメソッドには、プレフィックスの作成に使用されるDefaultBodyModelValidatorこのパラメーターがあります。keyPrefix残念ながら、このメソッドはオーバーライドできるように virtual としてマークされていません。したがって、次のようなことを行う必要があります(最初の部分を参照)。

于 2013-07-06T02:54:11.577 に答える
1

RegularExpressiondata-annotation 属性にエラーメッセージを設定できます。これを使えない理由はありますか?

public class Model
{
    [Required]
    [RegularExpression(@"^\d+.\d{0,2}$",ErrorMessage = "You didn't enter a decimal!")]
    public decimal Cost { get;set; }
}
于 2013-07-05T19:43:22.620 に答える