Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc MVC验证未按预期工作_Asp.net Mvc_Asp.net Mvc 3_Razor - Fatal编程技术网

Asp.net mvc MVC验证未按预期工作

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; } ...

不确定这是否是意料之中的,但这对我来说是一个惊喜

我正在使用RegistrationViewModel强式键入一个视图,但当我尝试提交表单时,验证在两个位置进行了错误的验证

  • 当我输入“测试”时,电子邮件字段不会引发验证错误
  • 密码验证器会说密码不匹配
  • 有人知道为什么会这样吗

    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 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; }