Asp.net mvc MVC验证未按预期工作
不确定这是否是意料之中的,但这对我来说是一个惊喜 我正在使用RegistrationViewModel强式键入一个视图,但当我尝试提交表单时,验证在两个位置进行了错误的验证Asp.net mvc MVC验证未按预期工作,asp.net-mvc,asp.net-mvc-3,razor,Asp.net Mvc,Asp.net Mvc 3,Razor,不确定这是否是意料之中的,但这对我来说是一个惊喜 我正在使用RegistrationViewModel强式键入一个视图,但当我尝试提交表单时,验证在两个位置进行了错误的验证 当我输入“测试”时,电子邮件字段不会引发验证错误 密码验证器会说密码不匹配 有人知道为什么会这样吗 ViewModel类: public class RegistrationViewModel { public RegisterModel RegistrationData { get; set; } ...
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 property管理器\u MVC.Areas.Account.ViewModels.RegistrationViewModel
@Html.TextBoxFor(m=>m.RegistrationData.Email)
@Html.ValidationMessageFor(m=>m.RegistrationData.Email)
@LabelFor(m=>m.RegistrationData.Password)
@PasswordFor(m=>m.RegistrationData.Password)
@Html.ValidationMessageFor(m=>m.RegistrationData.Password)
@LabelFor(m=>m.RegistrationData.ConfirmPassword)
@Html.PasswordFor(m=>m.RegistrationData.ConfirmPassword)
@Html.ValidationMessageFor(m=>m.RegistrationData.ConfirmPassword)
将此正则表达式添加到电子邮件属性,它将处理它
[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的例子来处理这个问题。
您指的是服务器端验证吗?不,客户端验证客户端验证和unobtrusive js都是在webconfig中启用的。感谢这一点-那么DataType.Email会做什么?@Greg-DataType属性不会影响验证,而是会影响显示和编辑器模板。当使用Html.DisplayFor时,DataType.Password使DisplayTemplate将密码格式化为mailto:链接。如果您愿意,您也可以覆盖此设置并创建自己的电子邮件模板。虽然在我第一次测试它时它正在工作,但验证错误又回来了(即使更改仍然存在)。抱歉,Shyju,我已再次将您的答案标记下来。我需要找到解决这个问题的方法。@Greg:我想你的代码中还有其他问题。我提供的代码将工作,因为我在一些应用程序中使用相同的,它工作良好。请提供您的错误详细信息,我们将对此进行处理。@Shyju-谢谢您的回复。。我没有任何其他与验证相关的代码。只有模型类上的比较属性。无论如何,其他代码如何“覆盖”验证行为?
[Required]
[DataType(DataType.Password)]
[Display(Name = "Confirm password")]
[Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
public string ConfirmPassword { get; set; }