我正在使用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。因此,即使已选择值,复制服务也会被标记为必需。有关如何解决此问题的任何建议吗?