2016-11-07 77 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來映射或映射手冊。

相關問題