2011-11-23 168 views
0

我的問題是關於MVC 2自定義驗證。我被困在一個特定的問題上,我不確定如何解決它。我相當肯定,它更多的是弄清楚如何在邏輯上做到這一點,然後在代碼中實現它。Asp.Net Mvc 2自定義驗證問題

所以我們有一個產品的元數據類。每個產品都有一個產品產品ID,它是PK,顯然是獨一無二的。每個產品也有一個獨特的產品代碼。然而,客戶輸入產品代碼,但代碼的性質確保只有一個代碼被附加到一個產品,因此它是唯一的。

這裏是從元數據類的一個片段:

public partial class ProductMetadata 
    { 
     [DisplayName("Product Name")] 
     [Required(ErrorMessage = "Product Name is required.")] 
     public string ProductName { get; set; } 

     [DisplayName("Product Code")] 
     [Required(ErrorMessage = "Product Code is required.")] 
     [ProductCodeAlreadyExistsValidator(ErrorMessage = "This Product code is in use.")]   
     public string ProductCode { get; set; } 
} 

的「ProductCodeAlreadyExistsValidator」創建一個新產品時,完美的作品。問題在於編輯現有產品,因爲再次對此屬性執行驗證,並且它正在數據庫中查找自己。這導致驗證失敗。

下面是從自定義驗證的一個片段:

public class ProductCodeAlreadyExistsValidator : ValidationAttribute 
    { 
     private readonly object typeId = new object(); 
     private const string defaultErrorMessage = "Product Code {0} is already present in the system."; 

     public ProductCodeAlreadyExistsValidator() 
      : base(defaultErrorMessage) 
     { 
     } 

     public override object TypeId 
     { 
      get 
      { 
       return typeId; 
      } 
     } 

     public string CustomerType { get; set; } 
     public string CustomerFriendlyType { get; set; } 

     public override string FormatErrorMessage(string roleName) 
     { 
      return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString, roleName); 
     } 

     protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
     { 
      if (!IsValid(value)) 
      { 
       string errorMessage = string.Format(defaultErrorMessage, validationContext.MemberName, value as string); 
       return new ValidationResult(errorMessage, new string[] { validationContext.MemberName }); 
      } 

      return null; 
     } 

     public override bool IsValid(object value) 
     { 
      bool alreadyPresent = false; 

      string ProductCode = value as string; 

      using (ModelContainer ctn = new ModelContainer()) 
      { 
       alreadyPresent = ctn.Products.Where(t => t.ProductCode == ProductCode).Count() > 0; 
      } 

      return !alreadyPresent; 
     } 
    } 

這可能是一個相對簡單的解決方法,但是我似乎已經撞了南牆吧。任何人都可以提供建議嗎?

回答

1

代碼對我來說似乎沒問題。我認爲您需要確定您是在執行插入還是更新,以便在更新字段時驗證可以忽略檢查。您可以檢查編輯的項目的ID是否與代碼找到的ID相同,它會被識別爲編輯。