我有一个视图模型,该视图模型是IValidatableObject
,其中包含也是CustomFields
的{{1}}的集合。视图模型和自定义字段都具有自定义逻辑,以检查发布后是否有效。
视图模型如下:
IValidatableObject
这可以正确验证public class ViewModel : IValidatableObject
{
public bool IsInspected { get; set; }
public DateTime? InspectedDate { get; set; }
public IList<CustomField> CustomFields { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (IsInspected == true && InspectedDate == null)
{
yield return new ValidationResult("Inspection Date is required if Inspected.", new[] { nameof(InspectedDate) });
}
}
}
public class CustomField : IValidatableObject
{
public bool IsRequired { get; set; }
public string Value { get; set; }
public string DisplayName { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (IsRequired && string.IsNullOrWhiteSpace(Value))
{
yield return new ValidationResult($"The {DisplayName} field is required.", new[] { nameof(Value) });
}
}
}
,但不能验证CustomFields
本身,除非ViewModel
没有错误。这意味着,如果用户发布了无效的“自定义字段”和无效的“视图模型”字段,则在他们更正“自定义字段”,再次发布并验证“视图模型”字段之前,他们不会收到有关“视图模型”字段的通知。
我尝试从CustomFields
中删除IValidatableObject
,而是在CustomField
方法内进行了foreach
循环,但是没有正确分配{突出显示窗体上的输入字段。例如,上面显示的方法创建了ViewModel.Validate()
的{{1}}键,而在ModelState
内部进行循环只是创建了ModelState
的键。