TryValidateObject不在Range上返回结果

时间:2017-01-16 21:30:46

标签: c# validation data-annotations custom-validators

我正在尝试利用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 == 0Address == null进行测试,我确实看到了地址错误,但没有看到CompanyId错误。

1 个答案:

答案 0 :(得分:1)

看起来我必须告诉TryValidateObject验证所有。

public static bool TryValidateObject(
    object instance,
    ValidationContext validationContext,
    ICollection<ValidationResult> validationResults,
    bool validateAllProperties
)

像这样:

Validator.TryValidateObject(this, validationContext, results, true);