2016-08-08 10 views
0

私はC#WebApiプロジェクトを持っており、クライアント入力の検証にFluentValidation.WebApiパッケージを使用しています。fluentvalidationエラーメッセージには、クライアントサイドのJSONプロパティ名ではなく、C#のプロパティ名が含まれていますか?

以下は、IsPremiumという名前のC#プロパティを持つモデルクラスコードです。この同じプロパティーには、すべてのクライアントのjson名 "isLuxury"があります。

[Serializable, JsonObject, Validator(typeof(ProductValidator))] 
public class Product 
{ 
    [JsonProperty("isLuxury")] 
    public bool? IsPremium { get; set; } 
} 

そして、私のバリデータクラスは、次のようになります。 http://localhost:52664/api/product

リクエストボディ::{ "isLuxury": "" }

だから、のような要求のために

public class ProductValidator : AbstractValidator<Product> 
    { 
     public ProductValidator() 
     { 
      RuleFor(product => product.isPremium).NotNull(); 
     } 
    } 

次のエラーが発生する:

{ 
    "Message": "The request is invalid.", 
    "ModelState": { 
    "product.isPremium": [ 
     "'is Premium' must not be empty." 
    ] 
    } 
} 

ここで流暢なのは、 "isLuxury"としてそれを知っているので、クライアントには意味をなさないC#のプロパティ名を選ぶことです。 "isLuxury"のようなより良いバリデーションを与えるために、C#のプロパティからではなく、jsonのプロパティから名前を選ぶように強制することができますか?

可能であれば、すべてのクライアントに公開されているこれらのjsonと同じ名前になるように、すべてのC#プロパティの名前を変更する必要があります。この問題を解決する他の方法があれば教えてください。

+1

[デフォルトのプロパティ名を上書きする](https://github.com/JeremySkinner/FluentValidation/wiki/d.-Configuring-a-Validator#overriding-the-default-property-name )を使用してJsonプロパティ名を使用します。 – stuartd

+0

でも、私は "product.isPremium"を得るので、これは部分的に問題を解決します:["'isLuxury'は空であってはいけません] - 今はproduct.isPremiumはapiのエンドユーザーにとって意味がありません。私もそれを変更することはできますか? – maverick

+0

それを持って、私はOverridePropertyNameを使用しなければならなかった。ご協力いただきありがとうございます。 – maverick

答えて

0

私のバリデータークラスを変更すると私にとっては効果的でした。

public class ProductValidator : AbstractValidator<Product> 
    { 
     public ProductValidator() 
     { 
      RuleFor(product => product.isPremium).NotNull().OverridePropertyName("isLuxury"); 
     } 
    } 

参照:https://github.com/JeremySkinner/FluentValidation/wiki/d.-Configuring-a-Validator#overriding-the-default-property-name

また、あなたは完全にプロパティの名前を変更したいWithName.If呼び出すことにより、単にプロパティ名を置き換えることができ、あなたの代わりにOverridePropertyNameメソッドを使用することができます。

+0

同じプロパティーのために 'OverridePropertyName'を呼び出す場合は、' WithName'を十分に呼び出してください –

+0

逆の場合は真です。同じプロパティに対してWithNameを呼び出す場合は、OverridePropertyNameを十分に呼び出します。 – maverick

+0

とにかく、どんな状況でも、両方のメソッドを呼び出す必要はありません。 –

関連する問題