【问题标题】:How to use DataAnnotation attributes for validating a model in a console app如何使用 DataAnnotation 属性在控制台应用程序中验证模型
【发布时间】:2020-05-02 08:03:25
【问题描述】:

我正在尝试在 ASP.net MVC 应用程序之外使用 DataAnnotation 属性验证。理想情况下,我想在我的控制台应用程序中使用任何模型类并将其装饰如下:

private class MyExample
{
    [Required]
    public string RequiredFieldTest { get; set; }

    [StringLength(100)]
    public int StringLengthFieldTest { get; set; }

    [Range(1, 100)]
    public int RangeFieldTest { get; set; }

    [DataType(DataType.Text)]
    public object DataTypeFieldTest { get; set; }

    [MaxLength(10)]
    public string MaxLengthFieldTest { get; set; }
}

然后(伪)做这样的事情:

var item = new MyExample(); // not setting any properties, should fail validation
var isValid = item.Validate();

我在网上的示例中找到了这段代码:

var item = new MyExample(); // not setting any properties, should fail validation

var context = new ValidationContext(item, serviceProvider: null, items: null);
var errorResults = new List<ValidationResult>();

// carry out validation.
var isValid = Validator.TryValidateObject(item, context, errorResults);

// isValid will be FALSE

这给了我“isValid = false”但它似乎只支持Required 字段并忽略其他字段。

以下代码在我期望它返回false时返回isValid = true

var item = new MyExample() {
    RequiredFieldTest = "example text"
};

var context = new ValidationContext(item, serviceProvider: null, items: null);
var errorResults = new List<ValidationResult>();

// carry out validation.
var isValid = Validator.TryValidateObject(item, context, errorResults);

// isValid will be TRUE - not expected behavior

使用属性(字符串长度、范围、最大长度、数据类型等)的所有其他验证尝试都通过有效。

有没有人见过这种行为或知道为什么会这样?

【问题讨论】:

    标签: c# asp.net-mvc validation data-annotations modelstate


    【解决方案1】:

    TryValidateObject 默认只验证required 属性。您可以将第四个参数validateAllProperties = true 传递给它,以验证其他属性。

    if (!Validator.TryValidateObject(item, context, errorResults, true)) {
        //invalid
    }
    

    【讨论】:

    • 这太棒了!适用于所有 除了 [DataType] 属性。如果我将 DataType 设置为 DataType.Email 或用于测试的东西,它仍然会返回其有效值——即使我只是设置了一个绝对不是电子邮件的随机数据对象或字符串。任何想法为什么这个没有被拿起?
    • 您似乎总是在框架中最不直观的方面磕磕绊绊。 DataType 尽管从 ValidationAttribute 继承不执行验证,并且用于显示目的,但它会覆盖 IsValid 以始终返回 true。检查DataTypeAttribute.cs。而是使用自定义验证,或 EmailAddress 属性。
    • 如果context 已经引用了TryValidateObject,为什么还需要item?努力理解上下文的目的。
    • 这是一个有趣的问题,我一直想研究它,所以谢谢你的提醒!对于第一个问题,根据ValidationContext 类,“在验证期间,尤其是属性级验证期间,对象实例可能处于不确定状态……请谨慎使用此实例”。在Validator.cs 中检查GetPropertyValues()
    • 对于第二个问题,ValidationContext 顾名思义,它提供了正在发生的验证的上下文信息,因此实际执行验证的其他类可以访问此信息(信息如 MemberNameDisplayName 正在验证的属性)。要查看如何使用上下文以及如何访问此信息的示例,请查看ValidationAttribute.csIsValid() 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 2012-04-19
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多