c# - 使用注释和 IValidatableObject 进行递归验证

标签 c# asp.net-mvc validation

我正在尝试使用注释和一些自定义代码来验证嵌套对象(不是 MVC 中的模型)。

我发现以下帖子很有用

Using Data Annotations Validation Manually and Object Graphs

正如答案中所建议的那样,我在容器类中创建了一个额外的例程来验证嵌套对象。这是我修改后的测试代码

public class Customer : IValidatableObject
{
    public Customer()
    {
        Details = new CustomerDetails();
    }

    [Required]
    [MaxLength(2)]
    public string Name
    {
        get;
        set;
    }

    public CustomerDetails Details
    {
        get;
        private set;
    }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        var context = new ValidationContext(this.Details, validationContext.ServiceContainer, validationContext.Items);
        var results = new List<ValidationResult>();
        Validator.TryValidateObject(this.Details, context, results);
        return results;
    }
}

但是,即使在将 validateAllProperties 设置为 true 的情况下调用 TryValidateObject 时,我也无法获取所有 验证错误。

        var context = new ValidationContext(cs, null, null);
        var results = new List<ValidationResult>();
        Validator.TryValidateObject(cs, context, results,true);

如果容器中有任何错误,只会显示这些错误。只有当容器对象中没有错误时,嵌套对象中的错误才会显示。我怀疑它与 Validate rouine 返回完整列表有关,并且无法从容器中添加到(现有)列表(?)

是否可以对例程进行任何修改以显示所有错误?

最佳答案

查看此答案:https://stackoverflow.com/a/3400627/724944

因此,您的类的属性中存在错误,因此不会调用 Validate 方法。 我建议使用 CustomValidationAttribute像这样:

[CustomValidation(typeof(Customer), "ValidateRelatedObject")]
public CustomerDetails Details
{
    get;
    private set;
}

public static ValidationResult ValidateRelatedObject(object value, ValidationContext context)
{
    var context = new ValidationContext(value, validationContext.ServiceContainer, validationContext.Items);
    var results = new List<ValidationResult>();
    Validator.TryValidateObject(value, context, results);

    // TODO: Wrap or parse multiple ValidationResult's into one ValidationResult

    return result;

}

关于c# - 使用注释和 IValidatableObject 进行递归验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8548482/

相关文章:

asp.net-mvc - 如何从 HandleError 过滤器返回 JSON?

asp.net-mvc - ASP NET MVC 剑道网格和列名称

php - 表单验证

python - Keras Sequential 模型中使用的验证数据是什么?

Laravel(Lumen) 更新时数组数据的唯一验证规则

c# - 我应该如何命名 DateTime 属性?

c# - 有没有办法删除单个实体的更改跟踪机制?

c# - 是否有用于显示伪随机数据库记录的 SQL Server 函数?

c# - 控制台应用程序中的进度栏​​问题

c# - 如何在数字前添加货币符号?