asp mvc自定义验证如何获取其他值

时间:2013-02-11 18:53:37

标签: asp.net-mvc validation mvvm data-annotations

我正在使用自定义验证比较用户名。我正在检查它是否与旧值相同,或者如果它通过正则表达式,它是可以接受的,但如果不是,则抛出错误。如果可能,如何从viewmodel获取UserID?

    [EmailValidation]
    public string Username{ get; set; }
    public int UserID { get; set; }



public class EmailValidationAttribute : ValidationAttribute
    {
         protected override ValidationResult IsValid(object value, ValidationContext validationContext)
         {

             User user= User.getUserByID(UserID); //How to get UserID?
             string username= value.ToString();
             if (user.Username== username || IsValid(username))
                {
                    return ValidationResult.Success;
                }
                else
                {
                    return new ValidationResult("Error");
                }

            }

3 个答案:

答案 0 :(得分:5)

您可以从ValidationContextObjectInstance获取UserID。在您的情况下,它将是您的User类的实例。

public class EmailValidationAttribute : ValidationAttribute
{
     protected override ValidationResult IsValid(object value, ValidationContext validationContext)
     {
         UserDto dto = (UserDto)validationContext.ObjectInstance;
         User user= User.getUserByID(dto.UserID);
         string username = value.ToString();
         if (user.Username == username || IsValid(username))
         {
            return ValidationResult.Success;
         }
         else
         {
            return new ValidationResult("Error");
         }

    }
}

如果您想要更通用的东西,可以添加指定属性名称的属性,并使用反射来获取值。

答案 1 :(得分:3)

最简单的方法是将验证移到类而不是字段验证器。

供参考:http://jeffhandley.com/archive/2009/10/16/validator.aspx

class MyClass : IValidatableObject {
    public string EmailAddress { get; set; }
    public int UserID { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
      User user= User.getUserByID(UserID); // UserID is available because this is a method on the object
      string username= value.ToString();
      if (user.Username== username || IsValid(username)) {
          // it's fine?
      } else {
          yield return new ValidationResult("Error");
      }
    }
}

答案 2 :(得分:1)

我建议您在此处执行两个步骤,以便将来可以使用此属性来添加任何新类:

1)创建一个包含UserID的抽象类,并让任何具有此EmailValidationAttribute的类扩展该类。

2)在验证中,您可以将value转换为抽象类类型,然后从那里获取UserID。