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

时间:2014-11-19 12:05:37

标签: c# asp.net-mvc asp.net-mvc-4 validation

我正在尝试创建自己的验证属性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,然后将此值与数据库中的任何内容进行比较。我不知道如何从表单字段中读取值。

2 个答案:

答案 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)]