2016-08-18 83 views
3

我正在动态创建一些表单,我在bootstrap 3和jquery 3.1.0旁边使用bootbox 4在MVC5应用程序中。Bootbox回调表单提交无法正常工作

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

用法:单击删除,通过模式删除bootbox确认,如果确认,请在表单上调用.submit()操作。

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 [email protected] 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中覆盖值由我查看foreach循环产生的所有形式的ID,最终HTML输出。这解释了为什么上述所有症状都在发生。我只是在返回viewModel之前将下面的代码添加到我的控制器中,并且它已修复: ModelState.Remove(“id”);

+0

什么是您的应用程序的HTML输出。我认为这个剧本没有问题。在这里做了一个小测试... https://jsfiddle.net/ymm8y0wb/ –

+0

我检查了我的html输出,我相信我可能找到了问题。我将表格嵌套在表格中。表格> tr> td>表格。我会清理我的观点,然后回复结果。 –

+0

BA_Webimax,我继续前进,并添加了一些HTML输出到我的文章。 –

回答

2

表格/ 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库版本 - 如果升级到jQuery,则必须升级到Bootstrap 3.3.7 3.x的

+0

我会继续,首先尝试建议的更改。感谢您填写关于jQuery和Bootbox的信息,我在此应用程序上运行了3.3.7。最后,用户如何在不点击继续的情况下提交表单?我很感激你在这个问题上花时间。 –

+0

这需要一个受过良好教育的用户,但你可以通过在浏览器的JavaScript控制台中运行'$('form')。submit()''来测试它。由于您只捕获某些按钮的点击事件,因此无法阻止页面上的这些表单触发提交事件。 –

+0

您可以通过捕获提交事件来处理该问题,然后使用AJAX发布删除请求(如果用户确认删除)。 –