2016-08-18 85 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發佈刪除請求(如果用戶確認刪除)。 –