Asp.Net Mvc 2 Пользовательский вопрос проверки - PullRequest
0 голосов
/ 23 ноября 2011

Мой вопрос касается пользовательской проверки MVC 2. Я застрял в определенной проблеме, и я не уверен, как обойти это. Я вполне уверен, что это больше понять, как сделать это логически, а затем реализовать его в коде.

Итак, у нас есть класс метаданных для продукта. Каждый продукт имеет идентификатор продукта, который является 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 Ответ

1 голос
/ 23 ноября 2011

Код мне кажется нормальным. Я думаю, вам нужно определить, делаете ли вы вставку или обновление, чтобы проверка могла игнорировать проверку при обновлении поля. Вы можете проверить, совпадает ли идентификатор отредактированного элемента с идентификатором, найденным кодом, он будет идентифицирован как редактирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...