如何使用强类型枚举的jQuery验证插件?

时间:2014-08-19 14:19:59

标签: jquery asp.net-mvc razor jquery-validate unobtrusive-validation

我正在使用强列表视图列出对象的枚举,如下所示:

@model IEnumerable<Foo>

<table>
    <tbody>
        @Html.EditorForModel()
    </tbody>
</table>

假设Foo有一个我想在客户端验证的简单数字属性:

public class Foo
{
    [Required]
    public int Bar { get; set; }
}

现在,此对象的编辑器模板如下所示:

@model Foo

<tr>
    <td>@Html.TextBoxFor(m => m.Bar)</td>
</tr>

这很好,除了默认模型绑定器生成[0].Bar之类的名称。但是,[]是jQuery验证插件的无效字符,因此每当它尝试验证我的输入时,我总是收到以下错误:

  

语法错误,无法识别的表达式:label [for ='[0] .Bar'],label [for ='[0] .Bar'] *,#[0] .Bar

在保持我的视图与模型绑定的同时,有没有办法让插件工作?

更新:我正在使用jQuery Validate和Microsoft的Unobstrusive Validation库(是的,默认的ASP.NET MVC设置),所以我根本不直接编写任何验证代码,只要它是兴趣!

1 个答案:

答案 0 :(得分:1)

[和]字符对jQuery验证插件严格无效。它只是一个草率的编码,并没有考虑到这些字符名称/ id的可能性。

甚至还有一个GitHub问题Handling ASP.NET MVC Input Arrays Exception

我所做的是从问题中获取代码(它上面有一个小问题)并在我的JavaScript初始化代码中添加了这个hack:

$.validator.prototype.idOrName = function(element) {
    return this.groups[element.name]
        || (this.checkable(element)
            ? element.name
            : element.id || element.name)
        .replace("[", "\\[")
        .replace("]", "\\]");
}

这可能不是最好的或最好的解决方案,但它对我有用。至少直到它在jQuery中修复。

无需使用此功能,因为它正在使用1.13.1(请参阅上面的问题进行讨论)。请注意,虽然我还没有检查过自己,但是ASP.NET MVC仍然可以捆绑1.13.0