我正在尝试将客户电子邮件和电话号码保存为加密字符串到数据库。显然它在实体框架验证上失败了,说不是有效的电子邮件地址或电话号码。在不影响字段验证的情况下,处理这种情况的最佳方法是什么?试图谷歌,但没有到达任何地方。
模型类字段:
[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."
任何帮助都将受到高度赞赏。
答案 0 :(得分:3)
您不应该直接在控制器上使用Entity Framework类。除了不好的做法,它还会导致你现在看到的确切问题。
相反,创建一个单独的模型类,类似于CustomerDto,具有模型验证属性,并将在控制器中使用,并将它们映射到数据库类。
答案 1 :(得分:1)
为电话号码和电子邮件地址添加两个新属性,例如EcryptPhoneNumber和EncryptEmailId,它们将作为参数传递给数据库。
customer.EcryptPhoneNumber = CryptorEngine.Encrypt(customer.PhoneNumber, true);
customer.EncryptEmail= CryptorEngine.Encrypt(customer.Email, true);
或另一个想法是使用Jquery进行验证。
谢谢。
答案 2 :(得分:1)
使用viewModel并加密您的字段,然后将它们映射到您的实体类。您可以使用automapper来映射或映射手册。