2016-11-07 23 views
0

顧客の電子メールと電話番号を暗号化された文字列としてデータベースに保存しようとしています。明らかに、有効な電子メールアドレスや電話番号ではなく、Entityフレームワークの検証に失敗します。フィールドの検証を妥協することなくこの状況を処理する最善の方法は何でしょうか? Googleに試してみましたが、どこにも行きません。電子メールと電話番号を暗号化された文字列として保存する

モデルクラスのフィールド:

[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

[電話番号]と[EmailAddress]を削除してください –

+0

ありがとう、属性をビューモデルに移動します – Faisal

答えて

3

コントローラでEntity Frameworkクラスを直接使用しないでください。悪い練習に加えて、それはあなたが今見ている正確な問題を引き起こします。

代わりに、モデル検証属性を持ち、コントローラで使用し、データベースクラスにマップする、CustomerDtoのような別のモデルクラスを作成します。

+0

ありがとうございます@jamesbascle – Faisal

1

パラメータとしてデータベースに渡すEcryptPhoneNumberとEncryptEmailIdのような電話番号と電子メールアドレスに2つの新しいプロパティを追加します。

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

または別のアイデアは検証のためにJqueryを使用しています。

ありがとうございました。

1

viewModelを使用してフィールドを暗号化し、エンティティクラスにマップします。 automapperを使って手動で地図を描くことができます。

関連する問題