使用 JS 嵌入 Html 后的 jQuery 表单验证

jQuery form validation after embedding Html with JS

提问人:Spring Elk 提问时间:2/1/2023 最后编辑:Spring Elk 更新时间:2/2/2023 访问量:108

问:

我有一个在 ASP.NET Core MVC (.NET6) + jQuery,Bootstrap。由于某些限制,某些导航页面必须使用 Ajax 请求以非典型方式动态嵌入。

$.ajax({
    url: link,
    type: 'GET',
    dataType: 'html',
    headers: { 'X-Page-Request': 'true' },
    success: function (data) {
        var isFullPage = /<!DOCTYPE *html>/i.test(data);
        if (!isFullPage) {
            $("#contentContainer").empty().append($(data));
        }
    }
});

一些端点返回部分视图,其中包含已呈现的 HTML 和 JS 代码,并且此代码在 Ajax 请求后嵌入到页面中,使用$("#contentContainer").empty().append($(data));

我只需要在单击“创建”按钮后验证表单并显示验证大纲,但即使在单击引导选择元素或“取消”按钮后也会触发验证。我已经将验证器的所有必要选项设置为默认值。

问题是,如果代码最初在页面上并且没有动态集成,则表单验证将按设计工作。但是,如果我使用 和 嵌入相同的代码,则在引导选择单击或任何按钮单击后,我会遇到意外的表单验证。 仅当使用 动态添加呈现的 HTML 和 JS 代码时,才会出现描述的问题。因此,具有类触发表单验证的元素:所有按钮、引导选择元素等。我需要禁止这种意外的表单验证,并仅使用验证。.append()$.validator.unobtrusive.parse().append().btn.valid()

有人有什么想法如何解决这个问题吗?提前致谢! P.S. 我想它与按钮元素或 .btn 类有某种关系。

嵌入式代码不包含任何特殊内容,除了看起来像往常一样。$.validator.unobtrusive.parse()

<div id="userModal" class="modal fade" role="dialog" style="display: none;">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="cl-modal-body modal-body">
                <form class="form" id="user1Form">
                    <div class="row shift">
                        <div class="col-xs-12">
                            <div class="flex-align-center">
                                <label for="name" class="input-name-text-align-right input-name">* Name:</label>
                                <input for="name" class="form-control" id="userName" name="name" data-val="true" data-val-required="* This field is required." />
                            </div>
                        </div>
                    </div>
                    <div class="row shift">
                        <div class="col-xs-12">
                            <div class="flex-align-center">
                                <label for="countryId" class="input-name-text-align-right input-name">* Country:</label>
                                <select for="countryId" class="cl-select-form-control form-control" name="countryId" id="countryId1" data-val="true" data-val-required="* This field is required."></select>
                            </div>
                        </div>
                    </div>
                </form>
            </div>
            <div class="cl-modal-footer">
                <button type="button" class="btn cl-modal-button" data-dismiss="modal">Cancel</button>
                <button type="button" id="userModalButton" class="btn btn-primary cl-modal-button">Save</button>
            </div>
        </div>
    </div>
</div>
<script type="text/javascript">
    $(document).ready(function () {
        $.validator.unobtrusive.parse("#userForm");
        initCountries();
        openUserModal();
    });
    ...
    $('#userModalButton').click(function (e) {
        if ($("#userForm").valid()) {
            ...
        }
    });
    ...
</script>
javascript asp.net bootstrap-4 jquery-validate unobtrusive-validation

评论

1赞 mplungjan 2/1/2023
请发布一个最小的可重现示例,并使用 [<>] 片段编辑器记录输入和预期输出。从 CDN 添加验证器并删除 ajax 代码(如果不相关)
0赞 mplungjan 2/1/2023
我在 w3org 中收到关于属性的错误,要么需要将其作为伪影从标签中删除,要么您需要添加 a 以使其成为表单属性for<input for="name" class="form-control" id="userName" name="name" data-val="true" data-val-required="* This field is required." />m
0赞 Sparky 2/2/2023
这两个按钮都是 ,这通常不会触发验证。但是,您为调用该方法的按钮创建了一个处理程序。仅供参考 - 调用表单会触发表单验证。而且您的 ID 不匹配:在一个地方和另一个地方。type="button".click().valid().valid()user1FormuserForm
0赞 Spring Elk 2/2/2023
这是正确的,我想使用我创建的处理程序来验证表单,并且只有这种方式。但是当我嵌入 HTML + JS 代码并应用时,似乎表单验证会触发每次点击类。哦,是的,对不起,这是“user1Form”的错别字。.valid().append()unobtrusive.parse().btn
0赞 Sparky 2/3/2023
是的,我现在看到点击处理程序只在一个按钮上。但是,我们无法看到它是否在两者上触发了其他一些东西。验证插件不会在 type=“button” 上触发,除非有强制执行。我在您上面发布的代码中没有看到任何解释单击取消按钮时的验证。

答: 暂无答案