Dot-Net
了解 DataAnnotations 中的 ValidationContext
我想使用
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);它工作正常,直到值為
nameisnull。我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”就足夠了。