我们的信用卡处理器 (Braintree Payments) 要求我们不要在信用卡字段(卡号、到期日期和 CCV)上使用“名称”属性,以确保它们不会以未加密的方式发布到服务器。我找到了一个自定义扩展来生成一个无名文本框( How to extend html.textboxfor to remove the name attribute? )。这很好用,因为它允许我们生成一个没有 name 属性的文本框,但它仍然会自动添加所有其他验证属性等。但我遇到了一个问题。
当我使用 @Html.NameLessTextBoxFor(model => model.CardNumber)
在我看来,它正确地生成了没有 name 属性的文本框。我们还在 View 模型中使用数据注释来生成不显眼的验证。实际网站上的可见问题是,当这些无名称字段之一出现验证错误时,ValidationMessage 跨度不会显示任何错误消息。无名称字段正确变为红色,但不显示错误消息。
我相信我已经推断出为什么这不起作用,但我不知道如何解决它。我查看了为 ValidationMessage 跨度生成的 HTML,我看到了这个属性:
data-valmsg-for="MyViewModel.CardNumber"
如果我的无名称字段的 name 属性设置为正常,那将是正确的。但是由于我无法设置 name 属性,如何让 ValidationMessage 仍然有效?
最佳答案
在提交时擦洗名称属性将类似于:
$("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;
}
玩玩它,看看你会发现什么。渴望知道你的最终结论,所以请更新。希望这对您有所帮助。
关于asp.net-mvc - Unobtrusive Validation 消息不适用于没有 name 属性的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15979842/