2

我们有可能从 GET 操作加载的数据可能对发布无效,并且希望能够在首次加载数据时显示验证消息。验证全部使用 ValidationAttributes 在服务器端进行。

如何在首次加载数据时强制显示验证摘要?我猜我需要以某种方式将错误强制到 ModelState 中,但我首先需要将它们从模型类中取出。

4

2 回答 2

1

我最终为模型类添加了一个验证方法,该方法将错误添加到 ModelState。然后,我创建并添加了一个自定义 ModelValidator 和 AssociatedValidatorProvider,用于在表单绑定期间进行的正常验证期间调用它。这样,不直接绑定到 Model 类的控制器操作仍然可以调用模型的 .Validate(ModelState) 方法来伪造验证。这种方法适用于仅服务器端的验证。

用户信息模型类

private IEnumerable<RuleViolation> GetRuleViolations()
{
    List<RuleViolation> violationList = new List<RuleViolation>();

    if (String.IsNullOrWhiteSpace(FirstName)) 
        violationList.Add(new RuleViolation("First Name is required.", FirstName"));

    return violationList;
}

public void Validate(System.Web.Mvc.ModelStateDictionary ModelState)
{
    foreach (RuleViolation violation in GetRuleViolations())
   {
        ModelState.AddModelError(violation.PropertyName, violation.ErrorMessage);
   }
}

这就是它可以直接从控制器操作中使用的方式。在此操作中,模型类对象作为 UserSearch 模型的一部分返回。

public ActionResult Search(UserSearch model)
{
    if (this.ModelState.IsValid)
    {
        model.Search();
        if (model.UserInfo != null )
        {
            model.UserInfo.Validate(ModelState);
        }
    }...

对于我正在处理的特定用例,这就是我所要做的。但是我继续完成了在回发上进行“正常”验证的工作:创建了一个简单的 ModelValidator,Validate 覆盖看起来像这样。如果您在所有模型类中都遵循上述模式,您可能也可以为它们重用此模式。

public override IEnumerable<ModelValidationResult> Validate(object container)
{
    var results = new List<ModelValidationResult>();
    if (Metadata.Model != null)
    {
        UserInfoViewModel uinfo = Metadata.Model as UserInfoViewModel;
        foreach (var violation in uinfo.GetRuleViolations())
        {
            results.Add(new ModelValidationResult
                {
                    MemberName = violation.PropertyName,
                    Message = violation.ErrorMessage
                });
        }
    }
    return results;
}

最后,扩展 AssociatedValidationProvider 以返回此 ModelValidator 并将其添加到 Application_Start 中的 ModelValidationProviders 集合中。在http://dotnetslackers.com/articles/aspnet/Customizing-ASP-NET-MVC-2-Metadata-and-Validation.aspx#s2-validation上有一篇相关文章

于 2012-06-21T03:55:39.657 回答
0

我不知道是否明白你需要什么,但这里是...

使用 jquery 运行验证以在加载表单时显示验证摘要

$(document).ready(function() {
    $('#FormId').valid(); 
});
于 2012-06-07T18:22:33.247 回答