我正在使用自定义验证比较用户名。我正在检查它是否与旧值相同,或者如果它通过正则表达式,它是可以接受的,但如果不是,则抛出错误。如果可能,如何从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");
}
}
答案 0 :(得分:5)
您可以从ValidationContext的ObjectInstance
获取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。