gpt4 book ai didi

c# - 未触发 TryValidateObject 和 IValidatableObject

转载 作者:太空狗 更新时间:2023-10-29 23:45:52 26 4
gpt4 key购买 nike

我有一个简单的问题(或没有)。

为什么当我验证我的对象时,下面的代码每次验证一个部分。

如果 DataAnnotations 失败,则不会调用 IValidatableObject 的验证。如果 DataAnnotations 正常,则调用 IValidatableObject 的验证。

我的问题是:为什么?我认为没有理由这样做。我错过了什么吗?

这是我的课(例如):

class Foo : IValidatableObject
{
[Required]
public DateTime Date { get; set; }

public virtual IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var errors = new List<ValidationResult>();

if (Date.Ticks > DateTime.Today.Ticks)
{
errors.Add(new ValidationResult("Some error.", new[] { "Date" }));
}

return errors;
}
}

这是我的验证:

var dto = new Foo();

validationResults = new List<ValidationResult>();
var context = new ValidationContext(dto, null, null);

Validator.TryValidateObject(dto, context, validationResults, true);

// Force
//var model = dto as IValidatableObject;

//if (model != null)
//{
// validationResults.AddRange(model.Validate(context));
//}

最佳答案

解决方法:

private void ValidateIValidatableObject(IValidatableObject validatableObject, IList<ValidationResult> errors)
{
var validations = validatableObject.Validate(null).ToList();

validations.Where(vr => vr.MemberNames == null)
.ToList()
.ForEach(vr => errors.Add(new ValidationResult(vr.ErrorMessage)));

validations.Where(vr => vr.MemberNames != null)
.SelectMany(vr => vr.MemberNames.Select(mn => new { MemeberName = mn, vr.ErrorMessage }))
.ToList()
.ForEach(vr => errors.Add(new ValidationResult(vr.ErrorMessage, new string[] { vr.MemeberName })));
}

用法:

IList<ValidationResult> errors = new List<ValidationResult>();

ValidationContext context = new ValidationContext(model, null, null);
Validator.TryValidateObject(model, context, errors, true);

if (model is IValidatableObject validatableObject)
{
ValidateIValidatableObject(validatableObject, errors);
}

致谢:https://github.com/aspnet/Mvc/issues/5366

关于c# - 未触发 TryValidateObject 和 IValidatableObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21727926/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com