2012-02-20 34 views
7

私はモデルを持っていますメソッドIsUsernameUnique(string name)とIsEmailUnique(文字列の電子メール)を持つIUserService `を使用し、それを私のval idatorクラス(モデルは一意のユーザー名と電子メールを持っている場合のみ有効です)。流暢検証カスタムの検証ルール

  1. 私のサービスを検証に使用するには?
  2. 複数の正規表現ルールを異なるエラーメッセージで登録することは可能ですか?それはクライアント側で動作しますか? (そうでない場合は、カスタム検証ロジックを作成する方法は?)
  3. は、サーバーサイドで検証されます。これは、モデルメソッドが渡される前に自動的に動作し、ModelState.IsValidプロパティを呼び出すだけで十分です。 ? 更新
  4. いくつかのプロパティを検証するときにモデルのすべてのプロパティにアクセスすることは可能ですか? (例えば、私はときレジスタパスワードとConfirmPasswordを比較したい)

答えて

21

1)どのように検証のための私のサービスを利用するには?

あなたはMustルール使用することができます

RuleFor(x => x.Email) 
    .NotEmpty() 
    .WithMessage("Email is required.") 
    .EmailAddress() 
    .WithMessage("Invalid email format.") 
    .Must(userService.IsEmailUnique) 
    .WithMessage("Email already taken"); 

2)別のエラーメッセージで複数の正規表現ルールを登録することが可能ですか?それはクライアント側で動作しますか? (そのための独自の検証ロジックを作成する方法、ありませんか?)

いいえ、あなたはありませんならば、どのようにそれ用のカスタム検証ロジックを作成するには、プロパティごとに

を一つだけ検証タイプを持つことができますか?

あなたはしなければならないルールを使用することができます。

RuleFor(x => x.Password) 
    .Must(password => SomeMethodContainingCustomLogicThatMustReturnBoolean(password)) 
    .WithMessage("Sorry password didn't satisfy the custom logic"); 

3)、サーバー側の検証は、アクションメソッドでモデルのパスの前に自動的に動作しますし、ModelState.IsValidプロパティを呼び出すのに十分ですそれとももっと何かをする必要がありますか?

はい、絶対に。

[HttpPost] 
public ActionResult Register(RegisterModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     // validation failed => redisplay the view so that the user 
     // can fix his errors 
     return View(model); 
    } 

    // at this stage the model is valid => process it 
    ... 
    return RedirectToAction("Success"); 
} 

UPDATE:あなたのコントローラのアクションは、このようになります。

4)いくつかのプロパティを検証するときに、モデルのすべてのプロパティにアクセスすることが可能ですか? (例えば、私はときレジスタパスワードとConfirmPasswordを比較したい)

はい、もちろん:

RuleFor(x => x.ConfirmPassword) 
    .Equal(x => x.Password) 
    .WithMessage("Passwords do not match"); 
+0

約2:私はmuを持っています複数の正規表現と各正規表現にはそれぞれ独自のエラーメッセージがあります。出来ますか? –

+0

@EvgenyLevin、私はすでにこれを私の答えで取り上げました。「いいえ、プロパティごとに1つのみ検証タイプを持つことができます。したがって、2つの可能性があります。すべてを検証できる単一の正規表現を用意するか、カスタムロジックを記述するためにMustルールを使用します。 –

+0

と私は1つ以上のカスタムルールのためのルールを書くことができません?アップデートを見てください(ポイント4)。 –

4

よりよいバリアントがRuleBuilderExtensionを使用することです:

public static class RuleBuilderExtensions 
{ 
    public static IRuleBuilder<T, string> Password<T>(this IRuleBuilder<T, string> ruleBuilder, int minimumLength = 14) 
    { 
     var options = ruleBuilder 
      .NotEmpty().WithMessage(ErrorMessages.PasswordEmpty) 
      .MinimumLength(minimumLength).WithMessage(ErrorMessages.PasswordLength) 
      .Matches("[A-Z]").WithMessage(ErrorMessages.PasswordUppercaseLetter) 
      .Matches("[a-b]").WithMessage(ErrorMessages.PasswordLowercaseLetter) 
      .Matches("[0-9]").WithMessage(ErrorMessages.PasswordDigit) 
      .Matches("[^a-zA-Z0-9]").WithMessage(ErrorMessages.PasswordSpecialCharacter); 
     return options; 
    } 

この方法でそれ簡単に使えるようになります:

RuleFor(x => x.Password).Password(); 
+0

ありがとうございます。 –

関連する問題