MVC 4 自动模型验证卡在带有嵌套 ViewModel 的 View Model 上

MVC 4 automated Model Validation stucks on ViewModel with nested ViewModel

我正在使用 C# MVC 4 服务器端。该站点的 Gerenel 目的是获取一些输入的文本信息以及用户提交的文件。

因此我使用了一个 ViewModel,它是 "parent" ViewModel,其中包含有关用户输入的文本信息的信息,称为 FileInformationViewModel。这个 "parent" ViewModel 包含另一个 "child" ViewModel,我们称它为 FileUploadViewModel。

这些 ViewModel 中的每一个都派生自 IValidateObject,并拥有自己的自定义 Validate 函数,仅验证模型的当前属性。这意味着 "parent" ViewModel 不会对 "child" ViewModel 进行任何验证,因为 "child" ViewModel 拥有自己的特定验证功能。

"child" ViewModel 将通过 MVC 4 提供的自动模型验证进行验证,并且 ModelState 将按预期设置。之后,"child" ViewModel 通过 MVC 模型绑定逻辑成功绑定到 "parent" ViewModel。 如果 "child" ViewModel 的验证失败,将不再处理 "parent" ViewModel 的验证函数,但我想在模型绑定上自动处理这两个验证。有什么方法可以实现这一点,或者是唯一可能在我的控制器上手动验证 ViewModel 的方法吗?

为了说明我的构造,这里是 "parent" ViewModel:

public class FileInformationViewModel : IValidatableObject
{
    public FileInformationViewModel()
    {
        ViewModel1 = new FileUploadViewModel();
    }

    public FileUploadViewModel ViewModel1 { get; set; }
    public string InputFieldToBeSet { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (!string.IsNullOrWhiteSpace(InputFieldToBeSet))
        {
            var result = new ValidationResult("Enter some information, please!", new[] { nameof(InputFieldToBeSet) });
            yield return result;
        }
    }

使用IValidatableObject短路验证。返回的第一个错误将导致进一步验证停止。那只是比赛的休息时间。没有办法解决这个问题。

如果您需要一次处理所有错误,则需要让模型绑定器处理验证,在您的视图模型属性上使用数据注释。您实际上可以通过这种方式处理几乎所有可以想象的场景,因为您始终可以添加自己的验证属性,或者那里有多个验证属性库。