Мой вопрос касается пользовательской проверки 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;
}
}
Возможно, это относительно простое исправление, но я, кажется, ударил его кирпичной стеной. Кто-нибудь может дать какой-нибудь совет?