将电子邮件和电话号码保存为加密字符串

时间:2016-11-07 07:58:23

标签: c# asp.net-mvc entity-framework validation encryption

我正在尝试将客户电子邮件和电话号码保存为加密字符串到数据库。显然它在实体框架验证上失败了,说不是有效的电子邮件地址或电话号码。在不影响字段验证的情况下,处理这种情况的最佳方法是什么?试图谷歌,但没有到达任何地方。

模型类字段:

    [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 :(得分: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来映射或映射手册。