怎样让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

【江湖人士】(jhrs.com)原创文章,作者:江小编,如若转载,请注明出处:https://jhrs.com/2021/41719.html
扫码加入电报群,让你获得国外网赚一手信息。
文章标题:怎样让WinForm程序Model验证?