Bootbox回调表单提交不能正常工作



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

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

用法:点击remove,引导框通过modal确认删除,如果确认,调用表单上的.submit()操作。

应用程序截图

问题:我点击删除按钮,它弹出一个模态来确认动作,我点击"继续",但它什么也不做。在所有表单元素中似乎只有一个有效的提交操作。因此,我能够成功地在每次页面刷新时对一个元素调用submit。

我是新的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>

编辑:解决方案

在最终的HTML输出中,modelstate覆盖了由foreach循环从我的View生成的所有表单的id值。这解释了为什么会出现上述所有症状。我简单地添加了以下代码到我的控制器返回我的viewModel之前,它是固定的: ModelState.Remove (" id ");

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函数。如果您想要自定义按钮文本,请遵循这里的第二个示例,如下所示。

$('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一起工作。

,尽管这更多地取决于父Bootstrap库版本——如果你已经升级到jQuery 3.x,你必须升级到Bootstrap 3.3.7。

最新更新