9

エディター テンプレートを使用するページでクライアント側の検証を機能させようとしています。

私のビューモデルの簡単な例は次のとおりです。

[Validator(typeof(ValidationTestModelValidator))]
public class ValidationTestModel
{
    public string Name { get; set; }

    public string Age { get; set; }

    public ChildModel Child { get; set; }
}

子モデルは次のとおりです。

public class ChildModel
{
    public string ChildName { get; set; }

    public string ChildAge { get; set; }
}

私のバリデーターは次のとおりです。

public class ValidationTestModelValidator : AbstractValidator<ValidationTestModel>
{
    public ValidationTestModelValidator()
    {
        RuleFor(m => m.Name)
            .NotEmpty()
            .WithMessage("Please enter the name");

        RuleFor(m => m.Age)
            .NotEmpty()
            .WithMessage("Please enter the age");

        RuleFor(m => m.Age)
            .Matches(@"\d*")
            .WithMessage("Must be a number");

        RuleFor(m => m.Child)
            .SetValidator(new ChildModelValidator());
    }
}

子モデルのバリデーターは次のとおりです。

public class ChildModelValidator : AbstractValidator<ChildModel>
{
    public ChildModelValidator()
    {
        RuleFor(m => m.ChildName)
            .NotEmpty()
            .WithMessage("Please enter the name");

        RuleFor(m => m.ChildAge)
            .NotEmpty()
            .WithMessage("Please enter the age");

        RuleFor(m => m.ChildAge)
            .Matches(@"\d*")
            .WithMessage("Must be a number");
    }
}

Application_Start() に以下を追加して、FluentValidation.Net を MVC3 に登録しました。

// Register FluentValidation.Net
FluentValidationModelValidatorProvider.Configure();

これにより、Name と Age の 2 つのプロパティに対して控えめなクライアント側の検証が完全に生成されますが、ChildModel のプロパティに対しては何も生成されません。

ここで私が間違っていることはありますか?

更新: ChildModel に Validator 属性で注釈を付ければ問題ないようですが、条件付きで検証を適用したいので、SetValidator() を使用します。

4

3 に答える 3

1

ドキュメントhttp://fluentvalidation.codeplex.com/wikipage?title=mvc&referringTitle=Documentationを分析しようとしました。バリデータ ファクトリは属性を使用して適切なバリデータをインスタンス化するため、MVC 統合はデフォルトで属性に基づいて機能すると述べています。どうやらメイン モデルのプロパティによって参照される ChildModel を検証しますが、これはクライアント側の検証コードを生成するためのモデル構造の自動再帰トラバーサルにすぎない可能性があります。そのため、同じメカニズムを使用して、ChildModel タイプの適切なバリデーターを見つけることができます。SetValidator ルールを削除した場合 (ただし、ChildModel の属性はそのままにしておきます)、属性に基づいてバリデーターが引き続き生成されるかどうかをテストできますか?

クライアント側でサポートされているバリデーターの明示的なリストがありますが、残念ながら SetValidator については言及 (または説明) されていません。これは悪い兆候です。

ドキュメントには、条件を使用するルールはクライアント側ではサポートされていないことも記載されているため、おそらく SetValidator を使用してこれを回避することはできません (更新で述べたように)。

クライアント側の条件付きルールに関するこのディスカッションも参照してください: http://fluentvalidation.codeplex.com/discussions/393596。jQuery Validation を使用して JS で条件付きルールを実装するという提案がありましたが、条件付きで追加する必要がある複雑な検証がある場合、これは複雑になる可能性があります。

属性を持つバリデーターを追加させて、後でどうにかしてそれらを抑制するのはどうですか? たとえば、後で要素から目立たない属性を削除することによって?

于 2012-09-04T22:02:15.743 に答える
1

アップデートで指摘したように、目立たないマークアップを発行する場合は、子タイプをバリデーターで装飾する必要があります。次に、if ブロックでラップするか、FluentValidation の When() メソッドを使用して式を使用することにより、これを「親」バリデータ クラスで条件付きで使用できます。

また、プロパティのルールをチェーンすることもできることに注意してください (つまり、流暢なインターフェースを使用):

RuleFor(m => m.ChildName)
    .NotEmpty()
    .WithMessage("Please enter the name")
    .Matches(@"\d*")
    .WithMessage("Must be a number");
于 2012-12-19T12:55:02.963 に答える
0

他の体が同じ問題を抱えている場合:

あなたにもバリデーター属性を追加する必要がありChildModelます

[Validator(typeof(ChildModelValidator))]
public class ChildModel

他のすべてのコードをそのままにしておくと、クライアント側で動作します

于 2016-09-05T15:50:08.007 に答える