4

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

当我@Html.NameLessTextBoxFor(model => model.CardNumber)在我的视图中使用时,它会正确生成没有名称属性的文本框。我们还在视图模型中使用数据注释来生成不显眼的验证。实际网站上的明显问题是,当这些无名字段之一出现验证错误时,ValidationMessage 跨度不会显示任何错误消息。无名称字段正确变为红色,但不显示错误消息。

我相信我已经推断出为什么这不起作用,但我不知道如何解决它。我查看了为 ValidationMessage 跨度生成的 HTML,我看到了这个属性:

data-valmsg-for="MyViewModel.CardNumber"

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

4

1 回答 1

0

擦洗提交时的名称属性将类似于:

$("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");
    }
});

或者确实像我一样做,并将回调编码为不显眼的验证,以检查验证是否已通过,然后删除名称属性。这是我添加该回调的注释:

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

玩一玩,看看你发现了什么。渴望知道你的最终结论,所以请更新。希望这对您有所帮助。

于 2013-04-12T21:26:57.217 回答