MVC 4自动模型验证使用嵌套的ViewModel

时间:2017-02-24 12:39:35

标签: validation asp.net-mvc-4 nested viewmodel

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

因此我使用ViewModel,它是“父”ViewModel,其中包含有关用户输入的文本信息的信息,名为FileInformationViewModel。这个“父”ViewModel包含另一个“子”ViewModel,让我们称之为FileUploadViewModel。

这些ViewModel中的每一个都是从IValidateObject派生的,并且拥有自定义的Validate函数,仅验证Model的当前属性。这意味着“父”ViewModel不会对“子”ViewModel进行任何验证,因为“子”ViewModel拥有它自己的特定验证函数。

“child”ViewModel将通过MVC 4提供的自动模型验证进行验证,ModelState将按预期进行设置。之后,“子”ViewModel通过MVC模型绑定逻辑成功绑定到“父”ViewModel。 如果“子”ViewModel的验证失败,则不再处理“父”ViewModel的Validate函数,但我想在Model Binding上自动处理两个Validations。有没有办法实现这一点,或者是唯一可能在我的控制器上手动验证ViewModel?

为了说明我的构造,这里是“父”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;
        }
    }

1 个答案:

答案 0 :(得分:0)

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

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