4

私は次のクラスを持っています。たとえば、それらは少し単純化されています。

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( ??? )
...

*(instance, propertyName) => return string.format('lineid_{0}_{1}', instance.Id, propertyName)* のような方法が必要です。

何か案は ?

4

2 に答える 2

2

「WithState」メソッドで解決。ジェレミーに感謝!彼のソリューションはこちらhttp://fluentvalidation.codeplex.com/discussions/278892

JeremyS
2011 年 11 月 10 日午後 5 時 16 分

残念ながら、これはサポートされていません。

プロパティ名は、バリデータの実行時に生成されるエラー メッセージとは対照的に、バリデータのインスタンス化時に 1 回だけ解決されます。この場合、検証中のインスタンスを調べてプロパティ名を生成する必要がありますが、これは実際には不可能です。取得できる最も近い方法は、WithState メソッドを使用してカスタム状態を失敗に関連付けることです。

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

バリデーターを呼び出して ValidationResult を取得したら、ValidationFailure の CustomState プロパティからこれを取得できます。

ジェレミー

于 2011-11-11T10:43:59.633 に答える
0

FluentValidator を使用している場合、次のように SuspendedLinesVM オブジェクトにコレクション バリデータを設定できるはずです。

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

これを行うと、ドキュメントに従って、失敗したプロパティのインデックスに関連するエラーのコレクションが返されます。

于 2011-11-10T20:16:27.450 に答える