如何使用 DataAnnotation 属性在控制台应用程序中验证模型

Rob*_*abe 1 c# validation asp.net-mvc modelstate data-annotations

我正在尝试在 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; }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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
Run Code Online (Sandbox Code Playgroud)

这给了我“isValid = false”但它似乎只支持该Required领域而忽略其他领域。

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

rhy*_*nix 5

TryValidateObject默认情况下仅验证required属性。您可以向它传递第四个参数validateAllProperties = true,以验证其他属性。

if (!Validator.TryValidateObject(item, context, errorResults, true)) {
    //invalid
}
Run Code Online (Sandbox Code Playgroud)