不显眼的验证消息不适用于没有name属性的输入

时间:2013-04-12 19:56:07

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

我们的信用卡处理商(Braintree Payments)要求我们不要在信用卡字段(卡号,到期日期和CCV)上使用“名称”属性,以明确确保他们不会未加密地发布到服务器。我找到了一个自定义扩展来生成无名称文本框(How to extend html.textboxfor to remove the name attribute?)。这很有用,因为它允许我们生成一个没有name属性的文本框,但它仍然会自动添加所有其他验证属性。但我遇到了一个问题。

当我在视图中使用@Html.NameLessTextBoxFor(model => model.CardNumber)时,它会正确生成没有name属性的文本框。我们还在View Model中使用Data Annotations来生成不引人注目的验证。实际网站上的可见问题是,当其中一个无名字段存在验证错误时,ValidationMessage范围不会显示任何错误消息。无名字段正确变为红色,但不显示错误消息。

我相信我已经推断为什么这不起作用,但我无法弄清楚如何修复它。我查看了生成的ValidationMessage范围的HTML,我看到了这个属性:

data-valmsg-for="MyViewModel.CardNumber"

如果我的无名字段的name属性设置为normal,那将是正确的。但由于我无法设置name属性,如何让ValidationMessage仍然有效?

1 个答案:

答案 0 :(得分:0)

在提交时刷新名称attrributes将类似于:

$("form").submit(function () {
    $(this.find(":input").removeAttr("name");
});

这可能在事件链中可能为时已晚,因此您可能必须阻止默认并重新发布表单,如下所示:

$("form").submit(function (e) {
    if($(this.find(":input[name]").length > 0) {
        e.preventDefault();
        $(this.find(":input").removeAttr("name");
        $(this).trigger("submit");
    }
});

或者确实像我一样,将callBack编码为不显眼的验证,以检查验证是否已通过,并在 点删除名称属性。以下是关于添加callBack的说明:

//Added the following to the onErrors function:
    if ($.isFunction(callBackOnError)) {
        setTimeout(function () {
            callBackOnError();
        }, 100);
    }
//Then in the exposing declarative section of the plugin
    onError: function (callBack) {
        callBackOnError = callBack;
    }

玩弄它,看看你发现了什么。热衷于了解您的最终结论,请进行更新。希望这对你有所帮助。