Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自定义验证属性-IsValid()参数为null_C#_Asp.net Mvc_Customvalidator_Validationattribute - Fatal编程技术网

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

C# 自定义验证属性-IsValid()参数为null,c#,asp.net-mvc,customvalidator,validationattribute,C#,Asp.net Mvc,Customvalidator,Validationattribute,我正在使用Simon Ince的RequiredIf自定义验证属性实现。在大多数情况下,它一直在工作,然而,我已经进入了一个不工作的情况,我似乎不明白为什么 以下是模型的相关部分: public class SiteOptionsViewModel { public short? RetrievalVendorID { get; set; } public short? CopyServiceID { get; set; } [Required(ErrorMessage

我正在使用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; }
}

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

您不将该属性应用于
IEnumerable
属性(或
DisplayName
属性)-该属性仅用于提供生成选项的值)。您将其应用于绑定到的属性(我假设它是
CopyServiceID
,但您没有显示视图),但在这种情况下使用
[RequiredIf]
没有任何意义。您在
RetrievalMethodID
上已经有了一个[Required]`属性,因此您只需要在
CopyServiceID
中添加一个
[Required]
属性,因为
RetrievalMethodID
也是required@StephenMuecke你当然是对的。星期五下午我肯定不是处于最佳状态。周末我的脑子在想这个问题,我得出了和你一样的结论。虽然您的第二个评论通常也是正确的,但我遗漏了一个我认为不相关的要求,但我认为它是正确的。我正在应用RequireIf属性的属性仅对一个特定客户机是必需的。我在这里选择了一个快捷方式,因为特定的RetrievalMethodID值10只存在于发出请求的客户端。感谢您的回复。您没有将该属性应用于
IEnumerable
属性(或
DisplayName
属性)-该属性仅用于提供生成选项的值)。您将其应用于绑定到的属性(我假设它是
CopyServiceID
,但您没有显示视图),但在这种情况下使用
[RequiredIf]
没有任何意义。您在
RetrievalMethodID
上已经有了一个[Required]`属性,因此您只需要在
CopyServiceID
中添加一个
[Required]
属性,因为
RetrievalMethodID
也是required@StephenMuecke你当然是对的。星期五下午我肯定不是处于最佳状态。周末我的脑子在想这个问题,我得出了和你一样的结论。虽然您的第二个评论通常也是正确的,但我遗漏了一个我认为不相关的要求,但我认为它是正确的。我正在应用RequireIf属性的属性仅对一个特定客户机是必需的。我在这里选择了一个快捷方式,因为特定的RetrievalMethodID值10只存在于发出请求的客户端。谢谢你的回复。
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;
}