Dot-Net

了解 DataAnnotations 中的 ValidationContext

  • November 30, 2010

我想使用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);

它工作正常,直到值為nameis 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 });
   }
}

“實體”是目前類的一個屬性,它引用了我要驗證的對象。這讓我可以驗證其他對象的屬性。如果您已經在 objct 中,“this”就足夠了。

引用自:https://stackoverflow.com/questions/4318524