2017-07-20 10 views
0

datatableライブラリを2つのボタンeditとdeleteと共に使用しました。フォーム(モーダルポップアップブートストラップ)を提出すると.itが閉じず、手動で閉じる必要があります。手動で "datatable"を手動で更新する必要があります。 2つの問題があります.1)モーダルポップアップが閉じず、2)datatableが更新されません。モーダルポップアップブートストラップを閉じて、asp.net mvcでajax呼び出しの後にデータテーブルを更新する方法は?

enter image description here @model Dentistry.Areas.ViewModels.UserViewModel

<div class="modal-header"> 
    <button type="button" class="close" data-dismiss="modal" aria-hidden="true"> 
     <span class="glyphicon glyphicon-remove" aria-hidden="true"></span> 
    </button> 
    <h4 class="modal-title custom_align" id="Heading">ویرایش کاربران</h4> 

</div> 
@using (Html.BeginForm("Edit", "Users", FormMethod.Post, new { id = "popupForm" })) 
{ 
    @Html.AntiForgeryToken() 
    if (Model != null && Model.UserId != string.Empty) 
    { 
     <div class="modal-body" id="editModal"> 
      <div class="form-group"> 
       @Html.HiddenFor(a => a.UserId) 
      </div> 
      <div class="form-group"> 
       <label>نام کاربری</label> 
       @Html.TextBoxFor(a => a.UserName, new { @class = "form-control" }) 
       @Html.ValidationMessageFor(a => a.UserName) 
      </div> 
      <div class="form-group"> 
       <label>نام</label> 
       @Html.TextBoxFor(a => a.FirstName, new { @class = "form-control" }) 
       @Html.ValidationMessageFor(a => a.FirstName) 
      </div> 

      <div class="form-group"> 
       <label>نام خانوادگی</label> 
       @Html.TextBoxFor(a => a.LastName, new { @class = "form-control" }) 
       @Html.ValidationMessageFor(a => a.LastName) 
      </div> 
      <div class="form-group"> 
       <label>جنسیت</label> 
       @Html.TextBoxFor(a => a.Gender, new { @class = "form-control" }) 
       @Html.ValidationMessageFor(a => a.Gender) 
      </div> 
      <div class="form-group"> 
       <label>وضعیت</label> 
       @Html.TextBoxFor(a => a.IsActive, new { @class = "form-control" }) 
       @Html.ValidationMessageFor(a => a.IsActive) 
      </div> 

      <div class="form-group"> 
       <label>ایمیل</label> 
       @Html.TextBoxFor(a => a.Email, new { @class = "form-control" }) 
       @Html.ValidationMessageFor(a => a.Email) 
      </div> 
      <div class="form-group"> 
       <label>آدرس</label> 
       @Html.TextBoxFor(a => a.Address, new { @class = "form-control" }) 
       @Html.ValidationMessageFor(a => a.Address) 
      </div> 
      <div class="form-group"> 
       <label>شماره تماس</label> 
       @Html.TextBoxFor(a => a.PhoneNumber, new { @class = "form-control" }) 
       @Html.ValidationMessageFor(a => a.PhoneNumber) 
      </div> 

      @*<a href="#" id="btnSubmit" class="btn btn-success btn-block">ویرایش</a>*@ 
     </div> 
     <div class="modal-footer"> 
      <button type="submit" class="btn btn-success btn-block" >ویرایش</button> 
      @*<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>*@ 
     </div> 
    } 
} 
<script> 
    //$(document).ready(function() { 


     $(function() { 
      $('#popupForm').on('submit', function (e) { 
       e.preventDefault(); 
       alert("hi"); 
       SubmitForm(); 
      }) 
     }); 
     function SubmitForm() { 
      var data = $("#popupForm").serialize(); 
      var url = "/Users/Edit"; 
      var form = $('#popupForm')[0]; 
      var formdata = false; 
      if (window.FormData) { 
       formdata = new FormData(form); 
      } 
      alert(formdata); 
      $.ajax({ 
       type: 'POST', 
       dataType: 'json', 
       url: url, 
       data: formdata ? formdata : data, 
       cache: false, 
       contentType: false, 
       // enctype: 'multipart/form-data', 
       processData: false, 
       success: function (data) { 
        if (data == true) { 
         $('#edit').modal('hide'); 
         window.location.href="/Users/Index"; 
         $("#myDatatable").ajax.reload(); 
        } 
       } 

      }); 
     } 

</script> 

============================ ================ MVCから

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Edit(UserViewModel user) 
{ 
    bool status=false; 
    if (ModelState.IsValid) 
    { 
     var userQuery=db.User.SingleOrDefault(u => u.Id == user.UserId); 
     if (user.UserId != string.Empty) 
     { 
      userQuery.FirstName = user.FirstName; 
      userQuery.LastName = user.LastName; 
      userQuery.PhoneNumber = user.PhoneNumber; 
      userQuery.UserName = user.UserName; 
      userQuery.Email = user.Email; 
      userQuery.Address = user.Address; 
      userQuery.Gender = Convert.ToBoolean(user.Gender); 
      userQuery.IsActive = Convert.ToBoolean(user.IsActive); 
     } 
     else 
     { 
      User userDB=new User(); 
      userDB = userQuery; 
      db.User.Add(userDB); 
     } 
     // db.Entry(user).State = EntityState.Modified; 
     db.SaveChanges(); 
     status = true; 

    } 
    // return RedirectToAction("Index"); 
    // return View(user); 
    return new JsonResult { Data = new { status = status } }; 
} 
+0

を知っているためにエラー関数を追加することができますAjaxの方法ではないような音成功を返す。ブラウザの[ネットワーク]タブを確認し、参照してください。 – nurdyguy

+0

@nurdyguy、はい、まさに私のajaxメソッドはうまくいきません。 – rayan

+0

[ネットワーク]タブでは何と表示されますか?何か? 「成功」に達しなかったからといって、それが始動しなかったわけではありません。何もしない場合でも、常に 'error:function(){...}'メソッドを持つべきです。 – nurdyguy

答えて

1

あなたの応答は、あなたがif(data.success == true)をテストする必要があなたのjQueryでそれのプロパティsuccessを持つオブジェクトです。ブール値なので、if(data.success)をショートカットとして使うこともできます。

+0

また、windows.locationを変更しているのでdatatable.reloadは必要ありません –

+1

これは良い点です。テーブルをリロードするか、ページをリロードするか、両方を行う必要はありません。私はページから移動するつもりだったが、私は定期的なフォームを提出するよりもむしろajaxを行うだろう。 – nurdyguy

+0

本当に必要なのは、新しい行を動的に追加してdraw extinsion関数を呼び出すことでした。このコードの問題は、データテーブルのajax呼び出しが同期していれば、そのページがそのajaxloadが起こるのを待たなければならないということです –

1

あなたの応答は

return Json(new{success =true},JsonRequestBehaviour.DenyGet); 

のようなものであるべきで、クライアント側

success: function (data) { 
        if (data.success) { 
         $('#edit').modal('hide'); 
         window.location.href="/Users/Index"; 
              } 
       } 

であなただけの

関連する問題