怎样让WinForm程序Model验证?如果你有asp.net mvc开发经验,就会知道我们可以调用ModelState.IsValid来验证模型。这是为了从安全或业务角度验证客户提交的数据的合法性。
WinForm程序Model验证
对于Winform开发,需要我们自己封装和提供类似的功能。对于Winform开发,我们需要自己封装,提供类似的功能。此外,您还可以在 stackoverflow 上找到类似的帖子。本文也分享了我是如何基于这些方法做的。对于Winform开发,我们需要自己封装,提供类似的功能。此外,您还可以在stackoverflow上找到类似的帖子。本文还分享了我是如何基于这些方法做到的。
以下内容来自c-sharpcorner.com上的帖子。我觉得这个帖子很好,可以帮助你学习一些有用的知识。
DataAnnotations验证模型
在第二篇文章中,我们将学习 DataAnnotation 中的所有验证表单。我们将回顾 Validator 类及其所有结构。第一部分可以在以下链接中找到。
DataAnnotation 使我们能够使用积极的编程。换句话说,它允许我们预测业务类或域类中问题的异常。它提供了更好的性能。消积编程版本也存在。
- 积极版 – TryValidate.
- 消极版 – Validate.
在此 链接上,您将获得有关异常和性能的信息。
示例类
所有示例的类将是第 I 部分中创建的类的新版本。
public class Customer { [Required(ErrorMessage = "{0} is mandatory")] [MaxLength(50, ErrorMessage = "The {0} can not have more than {1} characters")] public string Name { get; set; } [Range(typeof(DateTime), "01/01/2016", "01/01/2050", ErrorMessage = "Valid dates for the Property {0} between {1} and {2}")] public DateTime EntryDate { get; set; } public string Password { get; set; } [Compare("Customer.Password", ErrorMessage = "The fields Password and PasswordConfirmation should be equals")] public string PasswordConfirmation { get; set; } [Range(0, 150, ErrorMessage = "The Age should be between 0 and 150 years")] public int Age { get; set; } }
验证结果
ValidationResult 是类验证结果的容器。欲了解更多信息,请访问 此处。
ValidationResult 有 2 个属性
- ErrorMessages .- 带有信息错误描述的字符串只读属性。
- MemberNames .- IEnumerable<string> 只读属性,错误时带有属性名称。
我们编写了一个扩展方法来打印验证错误。
public static string ToDescErrorsString(this IEnumerable<ValidationResult> source, string mensajeColeccionVacia = null) { if (source == null) throw new ArgumentNullException(nameof(source), $"The property {nameof(source)}, doesn't has null value"); StringBuilder resultado = new StringBuilder(); if (source.Count() > 0) { resultado.AppendLine("There are validation errors:"); source.ToList() .ForEach( s => resultado.AppendFormat(" {0} --> {1}{2}", s.MemberNames.FirstOrDefault(), s.ErrorMessage, Environment.NewLine)); } else resultado.AppendLine(mensajeColeccionVacia ?? string.Empty); return resultado.ToString(); }
Validator 类
这是静态助手类。Validator 类允许您对对象、属性和方法执行验证。您可以从此链接获取更多信息 。
正如我们之前看到的,我们可以将其方法分为两组。 POSITIVE PROGRAMMING(返回 bool 值,我们有一个 ICollection<ValidationResult> 参数) 返回属性 bool 是一个验证结果。ICollection<ValidationResult> 参数包含验证错误的详细信息。如果验证没有错误,则此集合将为空。
TryValidateObject
public static bool TryValidateObject(object instance, ValidationContext validationContext, ICollection<ValidationResult> validationResults); public static bool TryValidateObject(object instance, ValidationContext validationContext, ICollection<ValidationResult> validationResults, bool validateAllProperties);
此方法验证所有对象。TryValidateObject 有一个带有 bool 参数 validateAllProperties 的重载,在验证错误继续验证所有属性时启用该参数。
参数
- Instance 要验证的类的实例。
- ValidationContext 描述要验证的对象的上下文。
- ValidationResults 验证结果描述的集合。
- ValidateAllProperties Enabled 继续验证所有属性。
例子
public static void TryValidateObjectExample1() { /// 1.- Create a customer var customer = new Customer { Name = string.Empty, EntryDate = DateTime.Today, Password = "AAAA", PasswordConfirmation = "BBBB", Age = -1 }; /// 2.- Create a context of validation ValidationContext valContext = new ValidationContext(customer, null, null); /// 3.- Create a container of results var validationsResults = new List<ValidationResult>(); /// 4.- Validate customer bool correct = Validator.TryValidateObject(customer, valContext, validationsResults, true); Console.WriteLine(validationsResults.ToDescErrorsString("Without Errors !!!!")); Console.Read(); }
在此示例中,我们使用真值 (ValidateAllProperties) 完成了第二次重载。
结果
我们已经验证了所有客户属性。
如果我们将最后一个参数更改为 false,它只会在出错时验证第一个属性。
public static void TryValidateObjectExample2() { /// 1.- Create a customer var customer = new Customer { Name = string.Empty, EntryDate = DateTime.Today, Password = "AAAA", PasswordConfirmation = "BBBB", Age = -1 }; /// 2.- Create a context of validation ValidationContext valContext = new ValidationContext(customer, null, null); /// 3.- Create a container of results var validationsResults = new List<ValidationResult>(); /// 4.- Validate customer bool correct = Validator.TryValidateObject(customer, valContext, validationsResults, false); Console.WriteLine(validationsResults.ToDescErrorsString("Without Errors !!!!")); Console.Read(); }
WinForm 执行模型验证
结果
TryValidateProperty
public static bool TryValidateProperty(object value, ValidationContext validationContext, ICollection<ValidationResult> validationResults);
WinForm 执行模型验证
它只有一个过载。它具有与 TryValidateObject 相同的参数,但第一个对象参数确实与要验证的一个属性匹配,因此该方法验证属性。
public static void TryValidatePropertyExample() { /// 1.- Create a customer var customer = new Customer { Name = string.Empty, EntryDate = DateTime.Today, Password = "AAAA", PasswordConfirmation = "BBBB", Age = -1 }; /// 2.- Create a context of validation ValidationContext valContext = new ValidationContext(customer, null, null) { MemberName = "Age" }; /// 3.- Create a container of results var validationsResults = new List<ValidationResult>(); /// 4.- Validate customer Age Property bool correct = Validator.TryValidateProperty(customer.Age, valContext, validationsResults); Console.WriteLine(validationsResults.ToDescErrorsString("Without Errors !!!!")); Console.Read(); }
WinForm 执行模型验证
当我们实例化 ValidationContext 对象时,我们将值赋予字符串属性 MemberName 和要验证的属性名称。
TryValidateProperty 和 TryValidateObject 是相等的。唯一的变化是第一个参数。TryValidateProperty 必须调用属性值。
结果
TryValidateValue
public static bool TryValidateValue(object value, ValidationContext validationContext, ICollection<ValidationResult> validationResults, IEnumerable<ValidationAttribute> validationAttributes);
WinForm 执行模型验证
TryValidateValue 通过 ValidationAttribute 集合验证值。这对于重用我们的 ValidationAttributes 并让我们不再滥用 if 术语是实用的。
public static void TryValidateValueExample() { /// 1.- Create value string myPwd = "33223"; /// 2.- Create ValidationsAttributes MinLengthAttribute minLengthAtribute = new MinLengthAttribute(8) { ErrorMessage = "{0} must have {1} caracters minimum" }; RequiredAttribute requieredAttribute = new RequiredAttribute { ErrorMessage = "{0} is mandatory" }; List<ValidationAttribute> atributes = new List<ValidationAttribute>() { minLengthAtribute, requieredAttribute }; /// 3.- Create a context of validation ValidationContext valContext = new ValidationContext(myPwd, null, null) { MemberName = "myPwd" }; /// 4.- Create a container of results var validationsResults = new List<ValidationResult>(); /// 5.- Validate myPwd value bool correct = Validator.TryValidateValue(myPwd, valContext, validationsResults, atributes); Console.WriteLine(validationsResults.ToDescErrorsString("Without Errors !!!!")); Console.Read(); }
WinForm 执行模型验证
我们已经在代码中创建了属性,因为我们将验证一个值并且我们没有要在类声明中标记的属性。
结果
NEGATIVE PROGRAMMING(抛出 ValidationException 并且它没有 ICollection<ValidationResult argument ) 这些方法删除了你名字中的 Try 一词。它们是空方法。如果验证失败,它将抛出 ValidationException。
他们没有 ICollection<ValidationResult> 参数。此信息将有一个内部异常,它不是一个集合。但是,它是一个简单的 ValidationResult,因为如果验证失败,它不会验证剩余的属性。
public static void ValidateObject(object instance, ValidationContext validationContext); public static void ValidateObject(object instance, ValidationContext validationContext, bool validateAllProperties); public static void ValidateProperty(object value, ValidationContext validationContext); public static void ValidateValue(object value, ValidationContext validationContext, IEnumerable<ValidationAttribute> validationAttributes);
WinForm 执行模型验证
例子
public static void ValidateObjectExample() { /// 1.- Create a customer var customer = new Customer { Name = string.Empty, EntryDate = DateTime.Today, Password = "AAAA", PasswordConfirmation = "BBBB", Age = -1 }; /// 2.- Create a context of validation ValidationContext valContext = new ValidationContext(customer, null, null); try { /// 3.- Validate customer Validator.ValidateObject(customer, valContext, true); } catch (ValidationException ex) { /// 4.- Print Validations Results ValidationResult s = ex.ValidationResult; Console.WriteLine("There are validation errors:"); Console.WriteLine(" {0,-20} --> {1}{2}", s.MemberNames.FirstOrDefault(), s.ErrorMessage, Environment.NewLine); } Console.Read(); }
结果
其他方法与“尝试”版本相同。
注意事项和测试
记住,我们可以使用第一章的扩展方法。
您拥有测试示例的源代码。
翻译自:https://znlive.com/how-to-make-winform-perform-model-validation