2016-07-08 69 views
4

我有以下規則:將多個規則轉化爲一個規則

RuleFor(x => x.FromNumber).NotEmpty().GreaterThan(0).When(x => x.NumbersRequired).WithState(x => MyErrorEnum.FromNumberRequired); 

酒店FromNumberint?類型。上面的問題是CustomState只設置爲GreaterThan。如果值爲空或0,則CustomState爲空。

如果我改變上述以下規則仍然按預期工作:

RuleFor(x => x.FromNumber ?? 0).GreaterThan(0).When(x => x.NumbersRequired).WithState(x => MyErrorEnum.FromNumberRequired); 

但是,有沒有更好的辦法,以這兩個規則組合成一個規則,而不是使用空條件運算符?

回答

1

,而不是使用一個自定義多個預定義的驗證規則的原因,有:在MVC

  1. 已經適當地生成客戶端驗證屬性
  2. 有不同的錯誤消息(通過使用默認的錯誤消息,或WithMessage法)

1日原因不是你的情況,因爲你用When條件 - 它取消任何客戶端屬性代受影響的規則。

2 -nd對於您的情況不是至關重要的,因爲如果您需要這樣做,您可以將錯誤消息合併爲一個錯誤消息。

所以您可以將規則組合成單個預測規則:

RuleFor(x => x.FromNumber) 
    .Must(x => x != null && x > 0) 
    .When(x => x.NumbersRequired) 
    .WithState(x => MyErrorEnum.FromNumberRequired); 

附:語法是這樣的:

RuleFor(x => x.FromNumber ?? 0) 

不僅改變驗證值,而且還可以在不可預知的方式改變when constructing dictionary of errors referrenced屬性名稱。僅在RuleFor/RuleForEach方法中使用屬性鏈表達式。如果您喜歡使用這樣的複雜表達式,請不要忘記在.WithName()方法中指定實際的屬性名稱。

+0

我該如何實現這個規則:'RuleFor(x => x.ToNumber).NotEmpty()。GreaterThan(x => x.FromNumber)'? –

+0

@ Ivan-MarkDebono使用另一個重載訪問模型:'RuleFor(x => x.ToNumber).Muxt((model,x)=> x!= null && x> model.FromNumber);' –