3

ASP.net プロジェクトでFluentValidationパッケージを使用しています。Validator コンストラクターにパラメーターを渡す方法を知りたいです。

バリデーターでやりたいことは次のとおりです。string MsgParamコンストラクターの次の点に注意してください。

public class RegisterModelValidator : AbstractValidator<RegisterModel>
{
    public RegisterModelValidator(string MsgParam) // <= Here
    {
        RuleFor(x => x.UserName)
            .NotNull()
            .WithMessage(MsgParam);
        RuleFor(x => x.Password)
            .NotNull()
            .Length(6, 100);
        RuleFor(x => x.ConfirmPassword)
            .Equal(x => x.Password);
    }
}

そして、データ注釈を使用して何かを渡すことができるかどうかわからない私のモデル:

// Find a way to pass a string to the validator
[FluentValidation.Attributes.Validator(typeof(RegisterModelValidator))]
public class RegisterModel
{
    public string UserName { get; set; }

    [DataType(DataType.Password)]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    public string ConfirmPassword { get; set; }
}

そのようなことは可能ですか?

4

1 に答える 1

4

誰かがこのページにたどり着いた場合、公式の FluentValidation ページ のJeremyS のおかげで、問題を (部分的に) 解決できました。

このソリューションでは、残念ながらクライアント側の検証がなくなることに注意してください!

バリデータ コンストラクターでパラメーターを取得するには、自動作成に頼るのではなく、手動でインスタンス化する必要があります。

は次のRegisterModelようになります。

public class RegisterModel
{
    public string UserName { get; set; }

    [DataType(DataType.Password)]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    public string ConfirmPassword { get; set; }
}

また、Registerコントローラーのメソッドを次のように変更する必要があります。

using FluentValidation.Mvc;
...
public ActionResult Register(RegisterModel model)
{
    RegisterModelValidator rmv = new RegisterModelValidator("Message passed as param");
    var result = rmv.Validate(model);

    if (result.IsValid)
    {
        // Here you decide what to do if the form validates
    }
    else
    {
        result.AddToModelState(ModelState, null);
    }
    return View(model);
}
于 2013-07-02T20:25:35.477 に答える