次のようなクラスユーザーがあります。
public class User
{
public int UserId { get; set; }
[Required(ErrorMessage = "A username is required.")]
[StringLength(20, ErrorMessage = "Your username must be 4-20 characters.", MinimumLength = 4)]
[RegularExpression("^[a-zA-Z0-9]*$", ErrorMessage = "Your username can only consist of letters and numbers.")]
[Remote("UsernameExists", "RemoteValidation", ErrorMessage = "Username is already taken")]
public string Username { get; set; }
[Required(ErrorMessage = "A password is required.")]
[MinLength(4, ErrorMessage = "Your password must have at least 4 letters.")]
public string Password { get; set; }
[Required(ErrorMessage = "An email address is required.")]
public string Email { get; set; }
}
登録機能のために、User オブジェクトとパスワード確認用の文字列を保持する ViewModel を作成しました。
public class RegistrationViewModel
{
public User User { get; set; }
[DisplayName("Password confirmation")]
[Required, Compare("User.Password", ErrorMessage = "The password do not match")]
public string PasswordConfirmation { get; set; }
}
私が遭遇する最初の問題は、ユーザーのプロパティが見つからないように見えるため、 Compare("User.Password") の検証が機能しないように見えることです。User.Password プロパティに対して PasswordConfirmation プロパティを検証する方法はありますか?
2 番目の問題は、ユーザー名フィールドのリモート検証です。http://davidhayden.com/blog/dave/archive/2011/01/04/ASPNETMVC3RemoteValidationTutorial.aspxにあるDavid Hayden のチュートリアルに従いましたが、UsernameExists メソッドのパラメーター username は常に null です。ここで何か不足していますか?
編集:
申し訳ありませんが、パスワードの比較で受け取ったエラーについては、実際には十分に明確ではありませんでした。フィールドに入力すると問題なく動作しますが、パスワードが一致しない場合はエラーが表示されます。ただし、フォームを送信すると、検証の概要に次のエラーが表示されます: UserToRegister.Password という名前のプロパティが見つかりませんでした。
編集2:
ジョーの投稿のおかげで、問題の一部がわかりました。リモートバリデーターは、コントローラーアクションのユーザー名パラメーターと明らかに一致しない URL/?UserToRegister.Username=temp をポストバックします。アクション パラメータを UserToRegister.Username にマップするには、次のものが必要です。
public ActionResult UsernameExists([Bind(Prefix = "UserToRegister.Username")]string username)
これにより、パラメーターがメソッドに正しく渡されるようになりました。ただし、パスワード フィールドで Compare 属性を使用すると、まだエラーが発生します。
ありがとう。