gpt4 book ai didi

.net - 了解DataAnnotations中的ValidationContext

转载 作者:行者123 更新时间:2023-12-03 12:16:24 26 4
gpt4 key购买 nike

我想利用Validator.TryValidateValue(),但不了解其机制。说,我有以下几点:

public class User {
[Required(AllowEmptyStrings = false)]
[StringLength(6)]
public string Name { get; set; }
}

和方法:
public void CreateUser(string name) {...}

我的验证代码是:
ValidationAttribute[] attrs = bit of reflection here to populate from User class
var ctx = new ValidationContext(name, null, null);
var errors = new List<ValidationResult>();
bool valid = Validator.TryValidateValue(name, ctx, errors, attrs);

直到 name的值为 null,它才能正常工作。我在实例化 ArgumentNullException时得到 ValidationContext,但不明白为什么。 TryValidateValue()也需要非空上下文。我有一个值和一个要验证的属性列表。那 ValidationContext是做什么用的?

最佳答案

唯一有问题的代码是验证上下文的实例对象。该实例不必是正在验证的值。对于Validator.ValidateProperty,是的,它确实必须是拥有该属性的对象,但是对于Validator.ValidateValue,“this”就足够了。

我编写了一个验证帮助程序类来进行设置。这使我可以从任何地方传递任意值。

public class ValidationHelper
{
private List<ValidationResult> m_validationResults = new List<ValidationResult>();
private List<ValidationAttribute> m_validationAttributes = new List<ValidationAttribute>();

public Tuple<bool, List<string>> ValidateDOB(DateTime? dob)
{
m_validationAttributes.Add(new CustomValidationAttribute(typeof(DateOfBirthValidator), "ValidateDateOfBirth"));
bool result = Validator.TryValidateValue(dob,
new ValidationContext(this, null, null),
m_validationResults,
m_validationAttributes);
if (result)
{
return Tuple.Create(true, new List<string>());
}
List<string> errors = m_validationResults.Select(vr => vr.ErrorMessage).ToList();
return Tuple.Create(false, errors);
}
}

如果要验证在属性上具有验证属性的属性,则要容易得多:
internal void Validate(T value)
{
if (!m_Initializing && TrackChanges && !Entity.IsImmutable)
{
Validator.ValidateProperty(value, new ValidationContext(Entity, null, null) { MemberName = PropertyName ?? ModelName });
}
}

“实体”是当前类的属性,它引用我要验证的对象。这使我可以验证其他对象的属性。如果您已经在对象中,则“this”就足够了。

关于.net - 了解DataAnnotations中的ValidationContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4318524/

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