将jQuery验证与动态生成表单的自定义错误消息一起使用

时间:2011-04-11 11:20:23

标签: jquery asp.net-mvc asp.net-mvc-2 validation

我有一个表单允许我在单个HTML表单中设置多个实体(例如书籍)的值。该页面的ASP.NET MVC视图采用包含List<Book>的模型。迭代后,为每本书呈现表单元素。

让我们假设我唯一的验证规则是书名是必需的。

如果用户未能输入任何书名,那么我想使用css类突出显示所有相关的书名文本框,并显示一次只显示“需要书名”的提醒。

我想使用jQuery验证插件来实现这一目标。

documentation告诉我们,如果我们要为元素设置自定义错误消息,我们会使用name部分中相关HTML表单元素的messages:属性来执行此操作。 validate()设置调用。

e.g。 (我的HTML元素的标题的<{1}}

name

但是,这似乎与ASP.NET MVC模型绑定在绑定到列表时需要使用$(".selector").validate({ rules: { title: "required", }, messages: { title: "Book titles must be set", } }) 属性的方式不兼容,因为它使用了每个表单元素的name属性非常具体的语法,例如

name

(摘自Haacked

对于jQuery验证而言,<form method="post" action="/Home/Create"> <input type="text" name="[0].Title" value="Curious George" /> <input type="text" name="[0].Author" value="H.A. Rey" /> <input type="text" name="[0].DatePublished" value="2/23/1973" /> <input type="text" name="[1].Title" value="Code Complete" /> <input type="text" name="[1].Author" value="Steve McConnell" /> <input type="text" name="[1].DatePublished" value="6/9/2004" /> <input type="text" name="[2].Title" value="The Two Towers" /> <input type="text" name="[2].Author" value="JRR Tolkien" /> <input type="text" name="[2].DatePublished" value="6/1/2005" /> <!-- There could be several more books in the form... --> <input type="submit" /> 属性的这些冲突用法是否是一个交易破坏者?

2 个答案:

答案 0 :(得分:1)

这就是我所做的(减少代码解释)

创建一个全局变量来保存验证消息,名为:validationMessages

在jquery验证的errorPlacement选项中,我有:

errorPlacement: function (error, element) { validationMessages += $(error).text() + '<br />'; },

然后这是我的提交表格功能......

function submitForm() 
{
    validationMessages = '';

    var valid = true;

    // do more/other/custom validation and css manipulation here
    // if item not valid, set valid = false and add to validationMessages as in errorPlacement

    if ($("#MainForm").valid() && valid) 
    {
        $("#MainForm").submit();
    }
    else 
    {
        // Show Message eg: mine looks like showAlert('Please complete the form', validationMessages, '600');
    }
}

答案 1 :(得分:1)

不幸的是,由于上面提到的原因,你不能使用带有jquery验证器的字符“[0] .Title”。 Jquery验证器使用HTML元素的name属性来构建javascript对象,以设置验证规则和验证消息。

一种解决方案是在使用jquery验证器之前更改name属性的值,然后在将表单发布到服务器之前将其设置回来。但是,这只有在客户端没有任何内容的情况下才会起作用,具体取决于“[0] .Title”之类的名称。