首页 > 解决方案 > 在加载时在 iframe 内容中添加客户端不显眼的验证规则

问题描述

环境上下文:ASP.NET MVC 5 和 jquery 不显眼的验证

我们有一些用户定义的字段,某些用户需要这些字段,而其他用户则不需要。因此,基于当前用户的帐户,我正在尝试仅添加客户端验证规则,其行为类似于服务器端数据注释规则。但也许这是错误的方法?也许我应该创建一个自定义数据注释验证规则服务器端然后让客户端自己处理?

无论如何,这就是我所拥有的:

function validateWorkOrderFormOnLoad() {

    //Parses the new form for unobtrusive validation
    var $form = $('form');

    if (intAccountId === 1) {
        //MUST INITIALIZE THE VALIDATOR FIRST
        var validator = $form.validate();

        $("#WOHdr_Attribute3").rules("add", {
            required: true,
            messages: {
                required: attribute3 + " is Required."
            }
        });

        $("#WOHdr_Attribute4").rules("add", {
            required: true,
            messages: {
                required: attribute4 + " is Required."
            }
        });
    }
    //$form.removeData('validator');
    //$form.removeData('unobtrusiveValidation');
    $.validator.unobtrusive.parse($form);
    var isValid = $form.valid();
}

在 iframe 内容(不是父级)的文档加载时调用它:

$(function () {
    setTimeout(function () {
        validateWorkOrderFormOnLoad();
    }, 2000);
     
});

这有效。但正如你所看到的,我必须延迟,我不喜欢这样,而且闻起来有点老套。

我尝试从 iframe 加载事件中调用此方法:

$iframe.load(function () { validateWorkOrderFormOnLoad(); });

这来自 iframe 内容页面中的脚本选项卡:

window.onload = function () {
   var $form = $("#frmWorkOrderHdr");
   parent.validateWorkOrderFormOnLoad($form);
}

在 iframe onload 事件上:

<iframe style="border:0px;width:100%;height:100px;display:none;" onload="validateWorkOrderFormOnLoad(this)" src=""></iframe>

除非我延迟,否则这些方法都不起作用。我错过了什么?哪个事件应该调用这个方法来显示表单加载的错误?

标签: jqueryasp.net-mvcvalidationiframe

解决方案


事实证明,我在加载时隐藏的表单上对此进行了测试,默认情况下,验证不会验证隐藏的元素。所以我不得不通过将忽略列表设置为空来告诉它不要忽略隐藏元素:

$form.validate().settings.ignore

它与延迟一起工作的原因是,表单会在加载后的某个时间显示,并且在延迟触发事件之前。


推荐阅读