【问题标题】:Show validation messages on GET在 GET 上显示验证消息
【发布时间】:2012-06-11 19:36:03
【问题描述】:

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

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

【问题讨论】:

  • 你读过这个吗? odetocode.com/blogs/scott/archive/2011/06/29/…您可以运行验证,然后用值填充 ModelState。
  • 这正是我一直在寻找的东西,@LukLed,谢谢......现在就试试吧。
  • 我试过了,@LukLed,但无法强制验证始终如一地进行。只要它们基于来自 DataAnnotation 的预设属性,它们就会触发,但我们添加的自定义属性不会……不知道为什么,我采取了另一种方法,见下文。

标签: asp.net-mvc-3 model-view-controller validation


【解决方案1】:

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

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

$(document).ready(function() {
    $('#FormId').valid(); 
});

【讨论】:

    【解决方案2】:

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

    UserInfo 模型类

    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);
       }
    }
    

    这是直接从控制器操作中使用它的方式。在此操作中,Model 类对象作为 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 有一篇关于此的文章

    【讨论】:

      猜你喜欢
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 1970-01-01
      • 2017-09-02
      • 1970-01-01
      相关资源
      最近更新 更多