【问题标题】:Bootbox callback form submit not working properlyBootbox 回调表单提交无法正常工作
【发布时间】:2016-08-18 15:53:24
【问题描述】:

我正在动态创建一些表单,并在 MVC5 应用程序中使用 bootbox 4 以及 bootstrap 3 和 jquery 3.1.0。

编辑:我将项目的 jquery 从 1.10.2 更新到 3.1.0,下面仍然有同样的问题。

用法:点击remove,bootbox通过modal确认删除,确认后调用form上的.submit() action。

Application Screenshot

问题:我点击删除按钮,它会弹出一个模式来确认操作,我点击“继续”但它什么也没做。所有表单元素中似乎只有一个有效的提交操作。所以我能够在每次页面刷新时成功调用一个元素的提交。

我是 javascript 新手,所以我现在有一个基本的了解,我正在尝试找出我在下面的代码中做错了什么。任何帮助将不胜感激。

我的查看代码:

@foreach (var user in Model.Users)

    {
        <tr>
            <td>
                @user.Id
            </td>
            <td class="text-center">
                @user.FirstName @user.LastName
            </td>
            <td class="text-center">
                @Html.CheckBox("role", user.IsAdmin)
            </td>
            <td>
                @using (Html.BeginForm("UpdateUserRole", "Admin", FormMethod.Post, new {@class = "btn-inline"}))
                {
                    @Html.Hidden("id", user.Id)
                    @Html.Hidden("role", user.GetRole(user.IsAdmin))
                    <button type="submit" class="btn btn-info">Update</button>
                }
                @using (Html.BeginForm("RemoveUser", "Admin", FormMethod.Post, new {@class = "btn-inline", @id=user.Id+"Form"}))
                {
                    @Html.Hidden("id", user.Id)
                    <button data-user-id=@user.Id type="submit" class="btn btn-danger buttonElement">Remove</button>
                }
            </td>
        </tr>
    }

我的脚本(添加到视图底部):

@section scripts
{
<script type="text/javascript">
    $(function () {
        $('form').on('click','button.buttonElement',function (e) {
            var user = $(this).attr("data-user-id");
            e.preventDefault();
            bootbox.dialog({
                message: "Do you want to continue ?", title: "Remove User",
                buttons: {
                    main: { label: "Cancel", className: "btn btn-default", callback: function () { return true; } },
                    success: { label: "Continue", className: "btn btn-default", callback: function () { $('#'+user+'Form').submit(); } }
                }
            });
        });
    });
</script>
}

编辑:这是一些 HTML 输出:

<table class="table table-hover">
    <tbody>
        <tr>
            <td>
                Joe
            </td>
            <td class="text-center">
                Joe Cuevas
            </td>
            <td class="text-center">
                <input checked="checked" id="role" name="role" type="checkbox" value="true"><input name="role" type="hidden" value="false">
            </td>
            <td>
                <form action="/Admin/UpdateUserRole" class="btn-inline" method="post">
                    <input data-val="true" data-val-regex="Invalid!" data-val-regex-pattern="([A-Za-z0-9.-])+" data-val-required="NetworkID is required!" id="id" name="id" type="hidden" value="joe"><input id="role" name="role" type="hidden" value="Admin">                        <button type="submit" class="btn btn-info">Update</button>
                </form>                    <form action="/Admin/RemoveUser" class="btn-inline" id="joeForm" method="post">
                    <input data-val="true" data-val-regex="Invalid!" data-val-regex-pattern="([A-Za-z0-9.-])+" data-val-required="NetwordID is required!" id="id" name="id" type="hidden" value="joe">                        <button data-user-id="joe" type="submit" class="btn btn-danger buttonElement">Remove</button>
                </form>
            </td>
        </tr>
    </tbody>
</table>

编辑:解决方案

事实证明,modelstate 在最终的 HTML 输出中覆盖了我的视图中 foreach 循环生成的所有表单的 id 值。这就解释了为什么会出现上述所有症状。在返回我的 viewModel 之前,我只是将以下代码添加到我的控制器中,并且它已修复: ModelState.Remove("id");

【问题讨论】:

  • 应用程序的 HTML 输出是什么。我不认为剧本有问题。在这里做了一个小测试...jsfiddle.net/ymm8y0wb
  • 我检查了我的 html 输出,我相信我可能发现了问题。我将表格嵌套在表格中。表格 > tr > td > 表格。我会清理我的视图,然后回复结果。
  • BA_Webimax,我继续在我的帖子中添加了一些 html 输出。
  • 我注意到有额外的data- 属性似乎用于输入验证。验证例程是否可能会以某种方式干扰表单提交,或者至少不能与 BootBox 一起使用?您是否尝试过禁用验证以查看其余过程是否有效?
  • 我已经从产生不必要的输入验证的 viewModel 中删除了数据注释。但这不是问题,这是我的脚本。我已接受以下答案作为解决方案。

标签: javascript jquery asp.net-mvc bootbox


【解决方案1】:

就嵌套而言,table / tr / td / form 很好。您可能可以通过以下方式简化触发表单提交:

$('form').on('click','button.buttonElement',function (e) {
    var user = $(this).attr("data-user-id");
    var form = $(this).closest('form'); // <-- add this

    e.preventDefault();

    bootbox.dialog({
        message: "Do you want to continue ?", 
        title: "Remove User",
        buttons: {
            main: { 
                label: "Cancel", 
                className: "btn btn-default", 
                callback: function () { 
                    return true; 
                } 
            },
            success: { 
                label: "Continue", 
                className: "btn btn-default", 
                callback: function () { 
                    form.submit();  // <-- change this
                }
            }
         }
    });
 });

您也可以简单地使用bootbox.confirm 函数。如果您想要自定义按钮文本,请按照第二个示例here,就像这样。

$('form').on('click','button.buttonElement',function (e) {
    var user = $(this).attr("data-user-id");
    var form = $(this).closest('form'); // <-- add this

    e.preventDefault();

    bootbox.confirm({
        message: "Do you want to continue ?", 
        title: "Remove User",
        buttons: {
            cancel: { 
                label: "Cancel", 
                className: "btn btn-default"
            },
            confirm: { 
                label: "Continue", 
                className: "btn btn-default"
            }
         },
         callback: function(result) {
             if(result == true) {
                 form.submit();
             }
         }
    });
 });

您可能需要考虑这样一个事实:用户可以在不点击继续按钮的情况下触发表单提交,在这种情况下,删除请求将在没有确认的情况下发生。

此外,Bootbox 尚未被确认可与 jQuery 3.x 一起使用,尽管这更多地取决于父 Bootstrap 库版本 - 如果您需要升级到 Bootstrap 3.3.7已经升级到 jQuery 3.x。

【讨论】:

  • 我会尽快尝试建议的更改。感谢您向我介绍 jQuery 和 Bootbox,我在此应用程序上运行 3.3.7。最后,用户如何在不点击继续的情况下提交表单?感谢您花时间回答这个问题。
  • 这需要受过良好教育的用户,但您可以通过在浏览器的 JavaScript 控制台中运行类似 $('form').submit() 的内容自行测试。由于您只捕获某些按钮的单击事件,因此没有什么可以阻止页面上的这些表单触发其提交事件。
  • 您可以通过捕获提交事件来处理这个问题,然后在用户确认删除时使用 AJAX 发布删除请求。
猜你喜欢
  • 1970-01-01
  • 2014-01-23
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 2018-10-21
  • 2017-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多