站点图标 江湖人士

怎样让WinForm程序Model验证?

C#9.0 新特性研究,全网第一篇

C#9.0 新特性研究,全网第一篇

怎样让WinForm程序Model验证?如果你有asp.net mvc开发经验,就会知道我们可以调用ModelState.IsValid来验证模型。这是为了从安全或业务角度验证客户提交的数据的合法性。

WinForm程序Model验证

对于Winform开发,需要我们自己封装和提供类似的功能。对于Winform开发,我们需要自己封装,提供类似的功能。此外,您还可以在 stackoverflow 上找到类似的帖子。本文也分享了我是如何基于这些方法做的。对于Winform开发,我们需要自己封装,提供类似的功能。此外,您还可以在stackoverflow上找到类似的帖子。本文还分享了我是如何基于这些方法做到的。

以下内容来自c-sharpcorner.com上的帖子。我觉得这个帖子很好,可以帮助你学习一些有用的知识。

DataAnnotations验证模型

在第二篇文章中,我们将学习 DataAnnotation 中的所有验证表单。我们将回顾 Validator 类及其所有结构。第一部分可以在以下链接中找到。

DataAnnotation 使我们能够使用积极的编程。换句话说,它允许我们预测业务类或域类中问题的异常。它提供了更好的性能。消积编程版本也存在。

在此 链接上,您将获得有关异常和性能的信息。

示例类

所有示例的类将是第 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 个属性

我们编写了一个扩展方法来打印验证错误。

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 的重载,在验证错误继续验证所有属性时启用该参数。

参数

例子

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) 完成了第二次重载。

结果

怎样让WinForm程序Model验证?

我们已经验证了所有客户属性。

如果我们将最后一个参数更改为 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 执行模型验证

结果

怎样让WinForm程序Model验证?

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 必须调用属性值。

结果

怎样让WinForm程序Model验证?

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 执行模型验证

 我们已经在代码中创建了属性,因为我们将验证一个值并且我们没有要在类声明中标记的属性。

结果

怎样让WinForm程序Model验证?

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();  
}  

结果

怎样让WinForm程序Model验证?

其他方法与“尝试”版本相同。

注意事项和测试

记住,我们可以使用第一章的扩展方法。

您拥有测试示例的源代码。

翻译自:https://znlive.com/how-to-make-winform-perform-model-validation

退出移动版