【问题标题】:Recursive validation using annotations and IValidatableObject使用注解和 IValidatableObject 进行递归验证
【发布时间】:2012-01-22 19:47:46
【问题描述】:

我正在尝试使用注释和一些自定义代码来验证嵌套对象(不是 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 返回完整列表有关,并且无法从容器中添加到(现有)列表中(?)

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

【问题讨论】:

    标签: c# asp.net-mvc validation


    【解决方案1】:

    看到这个答案: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;
    
    }
    

    【讨论】:

    • 好的,如果我理解正确的话,“validateAllProperties”只会影响带注释的属性,而不是单独的验证例程?但我确实尝试过实施你的例程,但我对你留下的 TODO 有疑问。由于 ValidateRelatedObject 返回单个 ValidationResult(对于单个带注释的属性),我如何让它将潜在的错误列表(来自嵌套对象)推送到来自容器对象的潜在错误列表中?原始示例在这方面似乎更有希望,因为它返回了一个列表。非常感谢您的帮助!
    • 在我的项目中,我只是将所有 ValidationResult 和 Merge 错误枚举到一个字符串中,用换行符分隔。后来需要用到的时候,我只是把错误拆分成多行。您也可以考虑创建一个像 MultiValidationResult 这样的类,它将存储实际的 ValidationResult 并公开串联错误。
    猜你喜欢
    • 1970-01-01
    • 2016-06-19
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 2014-11-10
    相关资源
    最近更新 更多