2012-03-24 15 views
0

わからない期待通りに動作していないが、それは私には驚きでした。..MVCの検証は、これが予想される場合

は、私は強くRegistrationViewModelとの見解を入力していますが、私は、フォームを送信するために、検証をしようとすると、 2か所で間違って検証されます。

  1. 「テスト」と入力すると電子メールフィールドで検証エラーが発生しません。
  2. パスワードバリデーターには、パスワードが一致しないと書かれています。

これはなぜ起こっているのですか?

のViewModelクラス:

public class RegistrationViewModel 
{ 
    public RegisterModel RegistrationData { get; set; } 
    ...  
} 

検証属性がRegistrationDataクラスのプロパティにある:

public class RegisterModel 
{ 
    [Required] 
    [Display(Name = "User name")] 
    public string UserName { get; set; } 

    [Required] 
    [DataType(DataType.EmailAddress)] 
    [Display(Name = "Email address")] 
    public string Email { get; set; } 

    [Required] 
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)] 
    [DataType(DataType.Password)] 
    [Display(Name = "Password")] 
    public string Password { get; set; } 

    [DataType(DataType.Password)] 
    [Display(Name = "Confirm password")] 
    [Compare("Password", ErrorMessage = "The Password and Confirmation password do not match.")] 
    public string ConfirmPassword { get; set; } 

    [Required] 
    [Display(Name = "First name")] 
    [StringLength(20, ErrorMessage = "First name must be between 2 and 20 characters.", MinimumLength = 2)] 
    public string FirstName { get; set; } 

    [Required] 
    [Display(Name = "Last name")] 
    [StringLength(20, ErrorMessage = "Last name must be between 2 and 20 characters.", MinimumLength = 2)] 
    public string LastName { get; set; } 
} 

ビュー:

@model PropertyManager_MVC.Areas.Account.ViewModels.RegistrationViewModel 
<div class="editor-field"> 
      @Html.TextBoxFor(m => m.RegistrationData.Email) 
      @Html.ValidationMessageFor(m => m.RegistrationData.Email) 
     </div> 
<div class="editor-label"> 
      @Html.LabelFor(m => m.RegistrationData.Password) 
     </div> 
     <div class="editor-field"> 
      @Html.PasswordFor(m => m.RegistrationData.Password) 
      @Html.ValidationMessageFor(m => m.RegistrationData.Password) 
     </div> 
     <div class="editor-label"> 
      @Html.LabelFor(m => m.RegistrationData.ConfirmPassword) 
     </div> 
     <div class="editor-field"> 
      @Html.PasswordFor(m => m.RegistrationData.ConfirmPassword) 
      @Html.ValidationMessageFor(m => m.RegistrationData.ConfirmPassword) 
     </div> 
+0

あなたはサーバー側の検証を指していますか? – Jon

+0

いいえ、クライアント側の検証 – Greg

+0

クライアント側の検証と目立たないjは両方ともwebconfigで有効です。 – Greg

答えて

2

プロパティをメールで送信するために、この正規表現を追加し、それは世話をするでしょう。

[Required] 
    [DataType(DataType.EmailAddress)] 
    [Display(Name = "Email address")] 
    [RegularExpression("^[a-z0-9_\\+-]+(\\.[a-z0-9_\\+-]+)*@[a-z0-9]+(\\.[a-z]{2,4})$", ErrorMessage = "Not a valid email")] 
    public string Email { get; set; } 

[パスワードの確認入力]フィールドの前に必須属性を追加します。

[Required] 
    [DataType(DataType.Password)] 
    [Display(Name = "Confirm password")] 
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")] 
    public string ConfirmPassword { get; set; } 

これを処理するScottguの例。 http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx

+0

ありがとうございました - DataType.Emailは何をしていますか? – Greg

+1

@Greg - DataType属性は検証に影響を与えず、表示テンプレートとエディタテンプレートに影響します。 DataType.Passwordは、DisplayTemplateがHtml.DisplayForを使用するときにmailto:リンクとしてパスワードを書式設定します。必要に応じて、これを上書きして独自のEメールテンプレートを作成することもできます。 –

+0

私は最初にそれをテストしたときに働いていましたが、バリデーションのエラーは戻っています(変更はまだありますが)。残念ながら、私はあなたの答えをもう一度マークしました。私はこれのための解決策を見つける必要があります。 – Greg

関連する問題