我有一个类用户,如下所示:
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; }
}
对于注册功能,我创建了一个 ViewModel,其中包含一个 User 对象和一个用于密码确认的字符串:
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 属性吗?
第二个问题是用户名字段的远程验证。我遵循了 David Hayden 的教程http://davidhayden.com/blog/dave/archive/2011/01/04/ASPNETMVC3RemoteValidationTutorial.aspx但UsernameExists方法中的参数username始终为null。我在这里错过了什么吗?
Edit:
抱歉,我实际上对密码比较收到的错误还不够清楚。填写字段时它工作正常,如果密码不匹配,我将收到错误。但是,在提交表单时,我在验证摘要中收到以下错误:找不到名为 UserToRegister.Password 的属性。
Edit 2:
感谢乔的帖子,我已经解决了部分问题。远程验证器发回 URL/?UserToRegister.Username=temp ,这显然与我的控制器操作的用户名参数不匹配。为了将我的操作参数映射到 UserToRegister.Username,需要以下内容:
public ActionResult UsernameExists([Bind(Prefix = "UserToRegister.Username")]string username)
现在,这可以正确地将参数传递给该方法。但是,在密码字段上使用“比较”属性时,我仍然收到错误。
Thanks.