validation - 如何强制MVC验证IValidatableObject

标签 validation asp.net-mvc-3

看来,当MVC验证其首先通过DataAnnotation属性(如必需或范围)运行的模型时,如果其中任何一个失败,它将跳过在我的IValidatableObject模型上运行Validate方法。

有没有办法让MVC继续运行该方法,即使其他验证失败呢?

最佳答案

您可以通过传入ValidationContext的新实例来手动调用Validate(),如下所示:

[HttpPost]
public ActionResult Create(Model model) {
    if (!ModelState.IsValid) {
        var errors = model.Validate(new ValidationContext(model, null, null));
        foreach (var error in errors)                                 
            foreach (var memberName in error.MemberNames)
                ModelState.AddModelError(memberName, error.ErrorMessage);

        return View(post);
    }
}

此方法的一个警告是,在没有属性级(DataAnnotation)错误的实例中,验证将运行两次。为了避免这种情况,您可以在模型中添加一个属性,例如一个 bool(boolean) 值Validated,运行该值后,您可以在Validate()方法中将该属性设置为true,然后在 Controller 中手动调用该方法之前进行检查。

因此,在您的 Controller 中:
if (!ModelState.IsValid) {
    if (!model.Validated) {
        var validationResults = model.Validate(new ValidationContext(model, null, null));
        foreach (var error in validationResults)
            foreach (var memberName in error.MemberNames)
                ModelState.AddModelError(memberName, error.ErrorMessage);
    }

    return View(post);
}

在您的模型中:
public bool Validated { get; set; }

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
    // perform validation

    Validated = true;
}

关于validation - 如何强制MVC验证IValidatableObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6431478/

相关文章:

ruby-on-rails - Rails "validates_uniqueness_of"区分大小写

node.js - 使用 Joi (Node.js) 中的外部函数进行验证

c# - 使用 Entity Framework 添加具有读/写操作和 View 的 Controller - "Data Context class"是什么?

asp.net-mvc-3 - ASP.NET 4.3 脚手架 : Add Controller vs Add View - different behavior?

c# - page.Isvalid 总是返回false?

c# - 单个 WebClient 实例的证书验证逻辑

c# - 在固定位置显示 WPF 验证错误消息

asp.net-mvc-3 - 在图表.net mvc3中设置间隔

asp.net - 在 Razor View 中渲染 Telerik MVC Grid 时出现问题

asp.net-mvc-3 - 如何发布部分 View 数据?