我创建了一个以类为目标的自定义 ValidationAttribute。每当我尝试调用 Validator.TryValidateObject 时,这都会正确验证。但是当我的类内的属性中有其他 ValidationAttribute 时,验证结果不包含类级别验证的结果。
这是一个示例代码:
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
public class IsHelloWorldAttribute : ValidationAttribute
{
public object _typeId = new object();
public string FirstProperty { get; set; }
public string SecondProperty { get; set; }
public IsHelloWorldAttribute(string firstProperty, string secondProperty)
{
this.FirstProperty = firstProperty;
this.SecondProperty = secondProperty;
}
public override bool IsValid(object value)
{
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value);
string str1 = properties.Find(FirstProperty, true).GetValue(value) as string;
string str2 = properties.Find(SecondProperty, true).GetValue(value) as string;
if (string.Format("{0}{1}", str1,str2) == "HelloWorld")
return true;
return false;
}
public override object TypeId
{
get
{
return _typeId;
}
}
}
这是我需要验证的类的代码
[IsHelloWorld("Name", "Code", ErrorMessage="Is not Hello World")]
public class MyViewModel : BaseViewModel
{
string name;
string code;
[Required]
public string Name
{
get { return model.Name; }
set
{
if (model.Name != value)
{
model.Name = value;
base.RaisePropertyChanged(() => this.Name);
}
}
}
public string Code
{
get { return code; }
set
{
if (code != value)
{
code = value;
base.RaisePropertyChanged(() => this.Code);
}
}
}
}
下面是我如何调用 TryValidateObject 方法:
var validationContext = new ValidationContext(this, null, null);
var validationResults = new List<ValidationResult>();
Validator.TryValidateObject(this, validationContext, validationResults, true);
现在,如果我在 Name 属性中有 [Required] 属性并且我尝试调用 Validator.TryValidateObject,则验证结果只有一个,这就是Required 验证的结果。但是当我从 Name 中删除 [Required] 属性并留下 IsHellowWorld 属性然后调用 TryValidateObject 时,它会给我一个结果,这就是 HellowWorldValidation 的结果。
我需要做的是在类级别和属性级别上进行所有验证。我可以在不实现自己的 TryValidateObject 方法的情况下实现这一目标吗?