2016-11-07 76 views
0

我试图将客户电子邮件和电话号码作为加密字符串保存到数据库。显然它在Entity框架验证上失败,说没有一个有效的电子邮件地址或电话号码。处理这种情况的最佳方式是什么,而不会影响域上的验证?试图谷歌它,但没有得到任何地方。将电子邮件和电话号码保存为加密字符串

模型类字段:

[Required] 
    [StringLength(256)] 
    [EmailAddress] 
    public string Email { get; set; } 

    [StringLength(256)] 
    public string Address { get; set; } 

    [Required] 
    [Phone] 
    [Display(Name = "Phone")] 
    public string PhoneNumber { get; set; } 

控制器的操作方法:

 if (ModelState.IsValid) 
     { 
      try 
      { 
       customer.CustomerCode = getNewCode(); 
       customer.PhoneNumber = CryptorEngine.Encrypt(customer.PhoneNumber, true); 
       customer.Email = CryptorEngine.Encrypt(customer.Email, true); 
       customer.Address = CryptorEngine.Encrypt(customer.Address, true); 
       customer.AddedBy = User.Identity.Name; 
       customer.AddedAt = DateTime.Now; 
       db.Customers.Add(customer); 
       db.SaveChanges(); 
      } 
      catch (DbEntityValidationException e) 
      { 
       foreach (var eve in e.EntityValidationErrors) 
       { 
        System.Diagnostics.Debug.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:", 
         eve.Entry.Entity.GetType().Name, eve.Entry.State); 
        foreach (var ve in eve.ValidationErrors) 
        { 
         System.Diagnostics.Debug.WriteLine("- Property: \"{0}\", Error: \"{1}\"", 
          ve.PropertyName, ve.ErrorMessage); 
        } 
       } 
       throw; 
      } 

      return RedirectToAction("Index"); 
     } 

错误输出窗口上:

Exception thrown: 
'System.Data.Entity.Validation.DbEntityValidationException' in EntityFramework.dll 
Entity of type "Customer" in state "Added" has the following validation errors: 
- Property: "Email", Error: "The Email field is not a valid e-mail address." 
- Property: "PhoneNumber", Error: "The Phone field is not a valid phone number." 

任何帮助,将不胜感激。

+3

删除[电话]和[电子邮件地址] –

+0

谢谢,将属性移动到视图模型 – Faisal

回答

3

你不应该直接在你的控制器上使用你的实体框架类。除了不好的做法,它会导致你现在看到的确切问题。

相反,创建一个单独的模型类,就像CustomerDto一样,它具有模型验证属性,并且将在您的控制器中使用,并将它们映射到您的数据库类。

+0

谢谢@jamesbascle – Faisal

1

为电话号码和电子邮件地址添加两个新属性,如EcryptPhoneNumber和EncryptEmailId,它们将作为参数传递到数据库。

customer.EcryptPhoneNumber = CryptorEngine.Encrypt(customer.PhoneNumber, true); 
customer.EncryptEmail= CryptorEngine.Encrypt(customer.Email, true); 

或另一个想法是使用Jquery进行验证。

谢谢。

1

使用viewModel并加密您的字段,然后将它们映射到您的实体类。你可以使用automapper来映射或映射手册。

相关问题