如何使用视图模型进行远程验证

时间:2015-12-17 04:34:30

标签: entity-framework asp.net-mvc-5 remote-validation

我有一个包含4个装配项目的asp.NET MVC 5项目。那些是;

  1. 普通
  2. 域名
  3. 服务
  4. Web.UI
  5. 我在域层中有一个模型类。

    public class Employee
    {
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ID { get; set; }
    
        [Required(ErrorMessage = "*Please insert employee's first name")]
        [Display(Name = "First Name", Prompt = "First Name")]
        public string firstName { get; set; }
    
        [Required(ErrorMessage = "*Please insert employee's last name")]
        [Display(Name = "Last Name", Prompt = "Last Name")]
        public string lastName { get; set; }
    
        [Required(ErrorMessage = "*Please insert employee's email address")]
        [Display(Name = "E-Mail", Prompt = "E-Mail")]
        [Remote("IsEmailExists", "Employee", ErrorMessage = "This email is already registered: please enter a different email.")]  
        [RegularExpression(@"^([0-9a-zA-Z]([\+\-_\.][0-9a-zA-Z]+)*)+@(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]*\.)+[a-zA-Z0-9]{2,3})$",
                    ErrorMessage = "*This email is invalid. Please enter a valid email")]
        public string email { get; set; }
    
    }
    

    Employee的Controller类位于Web.UI项目/ Layer中。在电子邮件属性的模型类中,我使用远程验证来检查注册新员工时电子邮件是否存在。检查在Employee Controller中的相关方法。

    public JsonResult IsEmailExists(string UserEmail)
    {
        //check if any of the Email matches the UserEmail specified in the Parameter using the ANY extension method.  
        return Json(!db.Employees.Any(x => x.email == UserEmail), JsonRequestBehavior.AllowGet);
    }
    

    这不符合我的预期。我搜索了一个问题的解决方案,我想到的是,我必须使用View模型,因为我正在使用汇编项目。但我不知道如何做到这一点。如果有人可以提供帮助,那将是一个很大的帮助。 感谢。

1 个答案:

答案 0 :(得分:3)

您的[RemoteAttribute]无效,因为您调用的方法参数不正确。它必须是

public JsonResult IsEmailExists(string email)

参数的名称必须与您应用该属性的属性的名称相匹配。

话虽如此,你仍然应该使用视图模型。例如int ID不合适(尚未创建用户)。 [Remote][Display]等属性不适用于数据模型。假设您需要输入密码,您的视图模型将需要一个额外的属性,例如ConfirmPasswrd,其[Compare]属性不适用于数据模型。

有关您应该使用视图模型的原因及其好处的详细信息,请参阅What is ViewModel in MVC?

附注:我建议您使用[EmailAddress]属性代替[RegularExpression]属性。