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;
}
}
這可能是一個相對簡單的解決方法,但是我似乎已經撞了南牆吧。任何人都可以提供建議嗎?