我正在尝试利用MVC之外的DataAnnotations.Validator。我有两个服务来验证他们各自的模型。两个模型都继承自我编写的具有ValidateModel()
方法的基类。
public class BaseValidatableDomainModel : IValidatableDomainModel
{
public BaseValidatableDomainModel()
{
ModelState = new ModelStateDictionary();
}
public ModelStateDictionary ModelState { get; set; }
public virtual void ValidateModel()
{
var validationContext = new ValidationContext(this, serviceProvider: null, items: null);
var results = new List<ValidationResult>();
Validator.TryValidateObject(this, validationContext, results);
foreach (var thisInvalidResult in results)
{
ModelState.AddModelError(thisInvalidResult.MemberNames.FirstOrDefault(),thisInvalidResult.ErrorMessage);
}
}
}
我对每个服务进行了测试,以便在数据无效时验证服务是否正常运行。一个模型正确错误PhoneNumber == null
:
[Required]
public string PhoneNumber { get; set; }
但是,CompanyId
为0时,其他模型不会出错.CompanyId定义如下:
public class CompanyAddressDomainModel : BaseValidatableDomainModel
{
// Other fields
[Required]
[Range(1, int.MaxValue, ErrorMessage = "Company is required")]
public int CompanyId { get; set; }
[Required]
public AddressInputDomainModel Address { get; set; }
}
代码调用这样的验证:
CompanyAddressDomainModel companyAddress = // set values
companyAddress.ValidateModel();
if (!companyAddress.ModelState.IsValid)
{
return companyAddress;
}
为什么会有一些验证,而不是其他验证?据我所知,这两个服务和模型定义相同。如果需要更多信息,请告诉我。
如果我使用CompanyId == 0
和Address == null
进行测试,我确实看到了地址错误,但没有看到CompanyId错误。
答案 0 :(得分:1)
看起来我必须告诉TryValidateObject验证所有。
public static bool TryValidateObject(
object instance,
ValidationContext validationContext,
ICollection<ValidationResult> validationResults,
bool validateAllProperties
)
像这样:
Validator.TryValidateObject(this, validationContext, results, true);