2011-11-23 129 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相同,它会被识别为编辑。