簡體   English   中英

使用注釋和IValidatableObject進行遞歸驗證

[英]Recursive validation using annotations and IValidatableObject

我試圖使用注釋和一些自定義代碼驗證嵌套對象(不是MVC senss中的模型)。

我發現以下帖子很有用

使用數據注釋驗證手動和對象圖

正如在答案中所建議的,我在容器類中創建了一個額外的例程來驗證嵌套對象。 這是我修改過的測試代碼

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;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM