从表单域读取自定义验证属性

本文关键字:验证 属性 自定义 读取 表单 | 更新日期: 2023-09-27 18:31:02

我正在尝试创建自己的验证属性IsUnique来检查给定属性的现有值。我知道必须覆盖IsValid()才能自定义验证属性起作用。到目前为止,我已经看到了带有验证属性的示例,这些属性采用字符串参数,然后将其与方法中的硬编码值进行比较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,然后将该值与数据库中的任何值进行比较。我不知道如何从表单字段中读取值。

从表单域读取自定义验证属性

这是代码

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;    }}
已经有一种

开箱即用的方法可以做到这一点http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.schema.indexattribute(v=vs.113).aspx

    [Index(IsUnique=true)]