Asp.Net Mvc 2自定义验证问题

时间:2011-11-23 10:51:20

标签: validation asp.net-mvc-2 metadata customvalidator

我的问题是关于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 个答案:

答案 0 :(得分:1)

代码对我来说似乎没问题。我认为您需要确定是否正在进行插入或更新,因此验证可以在更新字段时忽略检查。您可以检查编辑的项目的ID是否与代码找到的ID相同,它将被识别为编辑。