我正在使用 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,即使在 Copy Service 下拉列表中选择了一个值也是如此。因此,即使选择了一个值,复制服务也会被标记为必需。对于如何解决这个问题,有任何的建议吗?