2014-01-12 23 views
3

我有以下型號自定義屬性來驗證,如果郵件是在asp.net mvc的獨特

public partial class OwnerData 
{ 
    public string firstname { get; set; } 
    public string lastname { get; set; } 

    [Required] 
    [StringLength(60)] 
    [EmailAddress] 
    [MailNotExists] //this is a custom function 
    public string email { get; set; } 
} 

自定義功能MailNotExists如下

namespace MyApp.CustomDataAnnotations 
{ 
    public class MailNotExists : ValidationAttribute 
    { 
     protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
     { 
      DbContext db = new DbContext(); 

      var user = db.Users.FirstOrDefault(u => u.email == (string)value); 

      if (user == null) 
       return ValidationResult.Success; 
      else 
       return new ValidationResult("Mail already exists"); 
     } 
    } 
} 

該模型被用來進查看給用戶更改郵件的可能性,槽

@Html.EditorForModel(); 

html輸出返回到編輯器也是現有的郵件,如果你想改變它,系統首先檢查郵件是否已經存在於db通過驗證器[MailNotExists]並且一切正常。唯一的問題是,如果用戶不想更改郵件,但只需要名字或姓氏,然後提交表單,驗證器將返回錯誤,因爲郵件已存在。

任何解決方案如何旁路驗證程序只在該特定情況下?

回答

2

那麼它有點特殊,因爲我沒有看到主鍵,但我會做下一個方法添加主鍵所有者數據

public partial class OwnerData 
     { 
      public int Id { get; set; } 
      public string firstname { get; set; } 
      public string lastname { get; set; } 

      [Required] 
      [StringLength(60)] 
      [EmailAddress] 
      [MailNotExists] //this is a custom function 
      public string email { get; set; } 
     } 

和修改屬性

protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
     { 
      var owner = validationContext.ObjectInstance as OwnerData; 
      if(owner == null) return new ValidationResult("Model is empty"); 
      DbContext db = new DbContext(); 
      var user = db.Users.FirstOrDefault(u => u.email == (string) value && u.id != owner.Id); 

      if (user == null) 
       return ValidationResult.Success; 
      else 
       return new ValidationResult("Mail already exists"); 
     } 
+0

是的,對不起,我在我的例子中忘記了插入PK。事實上,在我的代碼中,模型包含很多屬性,但我只是將它清理成更合適。無論如何,你的解決方案完美無瑕。謝謝! – Sefira