我正在尝试创建自己的验证属性IsUnique
,用于检查给定属性的现有值。我了解必须覆盖IsValid()
,以便自定义验证属性可以正常工作。到目前为止,我已经看到了带有validate属性的示例,这些属性采用字符串参数,然后将其与IsValid()
方法中的硬编码值进行比较。
我需要IsValid()
方法来访问属性及其值,以进一步将其与数据库中的值进行比较。
这是我到目前为止所做的:
public class IsUnique : ValidationAttribute
{
private string codeno { get; set; }
: base("{0} is already in use")
public IsUnique (string codeno)
{
this.codeno = codeno;
}
public override ValidationResult IsValid(object value,
ValidationContext vContext)
{
if (value != null)
{
MyDBContext db = new MyDBContext();
Student studentsCodeNo =
db.Students.FirstOrDefault(r => r.codeno== (string)value);
if (studentsCodeNo != null)
{
string errorMessage =
FormatErrorMessage(vContext.DisplayName);
return new ValidationResult(errorMessage);
}
}
return ValidationResult.Success;
}
}
如上所述,问题是这个版本需要参数。我希望从用户表单字段中读取codeno
,然后将此值与数据库中的任何内容进行比较。我不知道如何从表单字段中读取值。
答案 0 :(得分:1)
这是代码
public class IsUnique : ValidationAttribute{
public override ValidationResult IsValid(object value,
ValidationContext vContext)
{
PropertyInfo property = validationContext.ObjectType.GetProperty("Codeno");
if (property == null)
return new ValidationResult(string.Format("Property '{0}' is undefined","Codeno"));
var fieldValue = property.GetValue(validationContext.ObjectInstance, null);
string codeno= (fieldValue == null ? "" : fieldValue.ToString());
if (!string.IsNullOrEmpty(codeno))
{
MyDBContext db = new MyDBContext();
Student studentsCodeNo =
db.Students.FirstOrDefault(r => r.codeno== codeno);
if (studentsCodeNo != null)
{
string errorMessage =
FormatErrorMessage(vContext.DisplayName);
return new ValidationResult(errorMessage);
}
}
return ValidationResult.Success; }}
答案 1 :(得分:0)
有一种开箱即用的方式可以做到这一点 http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.schema.indexattribute(v=vs.113).aspx
[Index(IsUnique=true)]