是否可以在
WPF或
Winforms类中使用System.ComponentModel.DataAnnotations并且它属于属性(例如required,Range,…)?
我想把我的验证放到attributs上.
谢谢
编辑1:
我写这个:
public class Recipe { [required] [CustomValidation(typeof(AWValidation),"ValidateId",ErrorMessage = "nima")] public int Name { get; set; } } private void Window_Loaded(object sender,RoutedEventArgs e) { var recipe = new Recipe(); recipe.Name = 3; var context = new ValidationContext(recipe,serviceProvider: null,items: null); var results = new List<System.ComponentModel.DataAnnotations.ValidationResult>(); var isValid = Validator.TryValidateObject(recipe,context,results); if (!isValid) { foreach (var validationResult in results) { MessageBox.Show(validationResult.ErrorMessage); } } } public class AWValidation { public bool ValidateId(int ProductID) { bool isValid; if (ProductID > 2) { isValid = false; } else { isValid = true; } return isValid; } }
但即使我将3设置为我的财产也没有发生任何事情
解决方法
是的,you can.这是
another article说明这一点.您甚至可以通过手动创建
ValidationContext在控制台应用程序中执行此操作:
public class DataAnnotationsValidator { public bool TryValidate(object @object,out ICollection<ValidationResult> results) { var context = new ValidationContext(@object,items: null); results = new List<ValidationResult>(); return Validator.TryValidateObject( @object,results,validateAllProperties: true ); } }
更新:
这是一个例子:
public class Recipe { [required] [CustomValidation(typeof(AWValidation),ErrorMessage = "nima")] public int Name { get; set; } } public class AWValidation { public static ValidationResult ValidateId(int ProductID) { if (ProductID > 2) { return new ValidationResult("wrong"); } else { return ValidationResult.Success; } } } class Program { static void Main() { var recipe = new Recipe(); recipe.Name = 3; var context = new ValidationContext(recipe,items: null); var results = new List<ValidationResult>(); var isValid = Validator.TryValidateObject(recipe,true); if (!isValid) { foreach (var validationResult in results) { Console.WriteLine(validationResult.ErrorMessage); } } } }
请注意,ValidateId方法必须是public static并返回ValidationResult而不是boolean.另请注意传递给TryValidateObject方法的第四个参数,如果希望计算自定义验证器,则必须将其设置为true.