2011-11-10 78 views
3

我有以下類,它們比較簡單。基於驗證對象的自定義屬性名稱

class LineInfo 
{ 
    Id, 
    LineNumber, 
    SubAccountNumer, 
    MobileNumber 
} 

class SuspendLinesVM{ 
    public List<LineInfo> Lines{ get;set; } 
} 

我在我的操作中收到SuspendLinesVM,並且所有行都是從客戶端動態創建的。屬於表單中具體LineInfo的每個元素都具有名稱,其模板名爲'lineid {Id} _ElementName'。於是,他們來到我的格式如:

lineid0001_LineNumber

lineid0001_SubAccountNumer

lineid0001_MobileNumber

lineid0021_LineNumber

lineid0021_SubAccountNumer

lineid0021_MobileNumber

當驗證時發生一些錯誤時,我需要一種方法來設置失敗的屬性,因爲它要求突出顯示視圖中的無效字段。

我留下了困惑的地方。

public class LineInfoValidator: AbstractValidator<LineInfo> 
    { 
     public LineInfoValidator() 
     { 
      RuleFor(m => m.LineNumber) 
       .NotEmpty().WithMessage("Line # is required").OverridePropertyName(???) 
       .InclusiveBetween(1, 9999).WithMessage("Line # must be in range [1, 9999]").OverridePropertyName(???) 
... 

我需要一種方法來像做*(例如,propertyName的)=>收益的String.Format( 'lineid_ {0} _ {1}',instance.Id,propertyName的)*。

任何想法?

回答

1

解決'WithState'方法。感謝傑里米!他的解決方案是在這裏http://fluentvalidation.codeplex.com/discussions/278892

JeremyS
二○一一年十一月一十日在下午5點16

不幸的是這是不是受支持。

當驗證程序實例化時,屬性名稱只解析一次,而不是執行驗證程序時生成的錯誤消息。在這種情況下,您需要檢查正在驗證的實例以生成屬性名稱,這實際上並不可行 - 您能夠獲得的最接近的方法是使用WithState方法將一些自定義狀態與故障關聯起來:

RuleFor(x => x.LineNumber) 
    .NotEmpty() 
    .WithState(instance => string.Format("lineid_{0}_LineNumber", instance.Id)); 

一旦您調用驗證程序並取回ValidationResult,您可以從ValidationFailure上的CustomState屬性中檢索它。

傑里米

0

假設你使用FluentValidator,你應該能夠設置SuspendedLinesVM對象的集合驗證,像這樣:

public class SelectedLinesVMValidator : AbstractValidator<SelectedLinesVM> 
{ 
    public SelectedLinesVMValidator() 
    { 
     RuleFor(x=>x.Lines).SetCollectionValidator(new LineInfoValidator()); 
    } 
} 

如果你這樣做,那麼as per the documentation你會得到錯誤的集合這與失敗財產的指數有關。

+0

這是正確的。但是對於我的集合中的所有LineInfo,每個屬性名稱將會像'LineNumber','SubAccountNumer'等一樣。視圖不會區分錯誤屬於哪個LineInfo,並且根本不會呈現錯誤,因爲屬性名稱必須像'lineid0001_LineNumber'。如果只有它很容易:) – Madman