1

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

    [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");
                }

            }
4

3 回答 3

5

ObjectInstance您可以从ValidationContext获取 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");
         }

    }
}

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

于 2013-02-11T18:59:21.853 回答
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");
      }
    }
}
于 2013-02-11T19:02:30.030 回答
1

我会在这里推荐一个两步过程,以便您将来可以将此属性与出现的任何新类一起使用:

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

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

于 2013-02-11T18:56:27.780 回答