自定义验证属性 - IsValid()参数为null

时间:2016-06-03 22:01:05

标签: c# asp.net-mvc customvalidator validationattribute

我正在使用Simon Ince的RequiredIf自定义验证属性实现。在大多数情况下它一直在工作,但是,我遇到了一种无法工作的情况,我似乎无法弄清楚原因。

以下是该模型的相关部分:

public class SiteOptionsViewModel
{
    public short? RetrievalVendorID { get; set; }
    public short? CopyServiceID { get; set; }
    [Required(ErrorMessage = "Select Retrieval Method For Site")]
    public short? RetrievalMethodID { get; set; }
    //drop down list items
    [DisplayName(@"Retrieval Vendor")]
    public IEnumerable<SelectListItem> RetrievalVendors { get; set; }
    [RequiredIf("RetrievalMethodID", 10, ErrorMessage = @"Copy Service required if Retrieval Method = OS")]
    [DisplayName(@"Copy Service")]
    public IEnumerable<SelectListItem> CopyServices { get; set; }
    [DisplayName(@"Record Format")]
    public IEnumerable<ExtendedSelectListItem> RetrievalMethods { get; set; }
}

在RequiredIfAttribute类中,我们必须覆盖IsValid()方法:

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
    // check if the current value matches the target value
    if (ShouldRunValidation(value, this.DependentProperty, this.TargetValue, validationContext))
    {
        // match => means we should try validating this field
        if (!_innerAttribute.IsValid(value))
            // validation failed - return an error
            return new ValidationResult(FormatErrorMessage(validationContext.DisplayName), new[] { validationContext.MemberName });
    }
    return ValidationResult.Success;
}

您会注意到模型中相关的两个属性都是IEnumerable<SelectedListItem>类型,供下拉列表使用。要求是当用户从“检索方法”下拉列表中选择特定值时,表单现在必须要求从“复制服务”下拉列表中选择一个值。我遇到的问题是,在IsValid()属性上调用RequiredIf时,即使在“复制服务”下拉列表中选择了值,value参数也为null。因此,即使已选择值,复制服务也会被标记为必需。有关如何解决此问题的任何建议吗?

0 个答案:

没有答案