2010-10-07 63 views
1

我有關於使用數據註釋進行驗證的各種問題。我使用以下設置在asp.net中驗證數據註釋的唯一性mvc

asp.net的MVC 2個 實體框架4個 數據註解

基本上,我試圖讓獨特的驗證工作,我有點困惑。我的型號如下:

public class Buyer 
{ 
    public int Id { get; set; } 

    [Required(ErrorMessage = "The email is required")] 
    public string Email { get; set; } 

    [Required(ErrorMessage= "The name is required")] 
    public string Name { get; set; } 
} 

    public class Seller 
{ 
    public int Id { get; set; } 

    [Required(ErrorMessage = "The email is required")] 
    public string Email { get; set; } 

    [Required(ErrorMessage= "The name is required")] 
    public string Name { get; set; } 
} 

我已成立了一個唯一的字段屬性如下

public class UniqueFieldAttribute : ValidationAttribute 
{ 
    public IUniqueValidator Validator { get; set; } 
    public int Id { get; set; } 

    public override bool IsValid(object value) 
    { 
     if (value == null) 
     { 
      return true; 
     } 

     return Validator.IsValid(Convert.ToString(value), Id); 
    }    
} 

我再創建一個實現IUniqueValidator接口驗證:

public class BuyerUniqueEmailValidator : IUniqueValidator 
{ 
    public bool IsValid(string value, int id) 
    { 
     TheDb db = new TheDb(); 


     var existing = from Buyer b in db.Buyers 
         where b.Email.ToLower() == value.ToLower() 
         select b; 

     foreach (Buyer b in existing) 
     { 
      if (b.Id != id) 
      { 
       return false; 
      } 
     } 

     return true; 
    } 
} 

的想法在那兒!但是,執行時我遇到問題。當我加上這個

[UniqueField(Validator=new BuyerUniqueEmailValidator(), Id=this.Id ErrorMessage= "This email is in use")] 

項目不會編譯。

基本上,我想知道的是,如果有可能將一個類傳遞給validationAttribute來執行驗證?另外,我怎麼能通過一個ID。

此外,有無論如何創建一個通用的唯一字段生成器,將適用於我所有的模型有一個電子郵件字段,或者我必須有一個BuyerEmailValidator,SellerEmailValidator等,我似乎無法讓T工作正常。

此刻只擔心服務器端。這

感謝

回答

0

您的代碼實現不能看到自己的事務不可見的任何記錄,並因此不能在多用戶環境中可靠地工作。爲什麼不使用數據庫約束?

+0

我將在生產中添加一個數據庫約束。但是,這更像是一個哲學問題。電子郵件應該是唯一的是一個業務規則,因此它應該在我的域模型中執行和測試。 – user10479 2010-10-07 15:52:49

+1

我明白你想要什麼,但我也假設你希望它能可靠地工作。您*無法*在模型級別執行此操作,並使其在100%的時間內正常工作。 – 2010-10-07 15:55:24