IValidatableObject无法验证子集合是否无效

时间:2018-08-02 20:03:09

标签: c# asp.net-core asp.net-core-mvc model-validation

我有一个视图模型,该视图模型是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的键。

0 个答案:

没有答案