1

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

4

0 回答 0