我正在使用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;
}
}
答案 0 :(得分:0)
使用Restore Defaults
短路验证。返回的第一个错误将导致进一步的验证停止。那只是比赛的休息时间。没有办法解决这个问题。
如果您一次需要所有错误,则需要让模型绑定器使用视图模型属性上的数据注释来处理验证。实际上,您可以通过这种方式处理几乎所有可以想象的场景,因为您总是可以添加自己的验证属性,或者有多个验证属性库。