简体   繁体   中英

Custom Validation Attribute reading from a form field

I am trying to create my own validation attribute IsUnique that checks existing values for given property. I understand IsValid() must be overridden so that custom validation attribute can work. So far I have seen examples with validate attributes that take a string parameters which is then compared with hard coded values inside IsValid() method.

I need IsValid() method to get access to a property and its value to further compare it with values in the database.

This is what I have done so far:

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;
    }
}

As said, the problem is that this version takes parameter. I would like codeno to be read from a user form field, and such value would then be compared against anything in database. I don't know how to read values from the form fields.

Here is code

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM