【问题标题】:Jquery datatable bind data from ajax来自ajax的Jquery数据表绑定数据
【发布时间】:2017-09-25 11:32:45
【问题描述】:

我对如何从控制器绑定数据有疑问。 这是这样的想法: 我在数据表中有数据列表。我需要从数据表中删除 1 个数据。我正在使用 ajax post 在控制器中调用 actionresult 并发送模型。我的控制器将删除数据,并将模型返回给视图。

这是我的视图模型:

public class SampleHeaderViewModels
{
    [Display(Name = "ID")]
    public int intID { get; set; }

    [Display(Name = "Field 1")]
    public string txtField1 { get; set; }

    [Display(Name = "Field 2")]
    public string txtField2 { get; set; }
}

public class SampleDetailViewModels
{
    [Display(Name = "ID")]
    public int intID { get; set; }

    [Display(Name = "Line")]
    public int intLine { get; set; }

    [Display(Name = "Detail 1")]
    public string txtDetail1 { get; set; }

    [Display(Name = "Detail 2")]
    public string txtDetail2 { get; set; }
}

public class SampleViewModels
{
    public SampleHeaderViewModels Header { get; set; }
    public List<SampleDetailViewModels> Detail { get; set; }

    public SampleViewModels()
    {
        Header = new SampleHeaderViewModels();
        Detail = new List<SampleDetailViewModels>();
    }
}

这是我的观点:

<div class="row">
    <div class="block">
        <div class="block-content controls">
            <div class="col-md-6">
                <div class="row-form">
                    <div class="col-md-4">
                        @Html.LabelFor(m => m.Header.txtField1, htmlAttributes: new { @class = "control-label" })
                    </div>
                    <div class="col-md-8">
                        @Html.HiddenFor(m => m.Header.intID)
                        @Html.TextBoxFor(m => m.Header.txtField1, htmlAttributes: new { @class = "form-control" })
                    </div>
                </div>
                <div class="row-form">
                    <div class="col-md-4">
                        @Html.LabelFor(m => m.Header.txtField2, htmlAttributes: new { @class = "control-label" })
                    </div>
                    <div class="col-md-8">
                        @Html.TextBoxFor(m => m.Header.txtField2, htmlAttributes: new { @class = "form-control" })
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<div class="row">
    <div class="block">
        <div class="block-content controls">
            <div class="col-md-12">
                <div class="row-form">
                    <table id="tbDataTable" class="table table-bordered">
                        <thead>
                            <tr>
                                <td>

                                </td>
                                <td>
                                    @Html.LabelFor(m => m.Detail.FirstOrDefault().intLine)
                                </td>
                                <td>
                                    @Html.LabelFor(m => m.Detail.FirstOrDefault().txtDetail1)
                                </td>
                                <td>
                                    @Html.LabelFor(m => m.Detail.FirstOrDefault().txtDetail2)
                                </td>
                            </tr>
                        </thead>
                        <tbody>
                            @if (Model.Detail != null)
                            {
                                for (int x = 0; x <= Model.Detail.Count - 1; x++)
                                {
                                    <tr>
                                        <td>
                                            <button type="button" class="btn btn-primary" onclick="return DeleteDetail('@Model.Detail[x].intLine');">Delete</button>
                                        </td>
                                        <td>
                                            @Html.DisplayFor(m => @Model.Detail[x].intLine)
                                            @Html.HiddenFor(m => @Model.Detail[x].intLine)
                                        </td>
                                        <td>
                                            @Html.DisplayFor(m => @Model.Detail[x].txtDetail1)
                                            @Html.HiddenFor(m => @Model.Detail[x].txtDetail1)
                                        </td>
                                        <td>
                                            @Html.DisplayFor(m => @Model.Detail[x].txtDetail2)
                                            @Html.HiddenFor(m => @Model.Detail[x].txtDetail2)
                                        </td>
                                    </tr>
                                }
                            }
                    </table>
                </div>
                <div class="row-form">
                    <div class="col-md-2">
                        <button type="button" id="btnAddDetail" class="btn btn-info">Add Detail</button>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

这是我的 Javascript:

function DeleteDetail(intLine)
    {
        debugger;
        
        var modelHeader = {
            "intID": $('#@Html.IdFor(m => m.Header.intID)').val(),
            "txtField1": $('#@Html.IdFor(m => m.Header.txtField1)').val(),
            "txtField2": $('#@Html.IdFor(m => m.Header.txtField2)').val(),
        };

        var modelDetail = @Html.Raw(JsonConvert.SerializeObject(Model.Detail));

        $.ajax({
            url: '/Sample/DeleteDetail',
            type: 'POST',
            datatype: 'JSON',
            contentType: 'application/json',
            data: JSON.stringify(
                {
                    objHeader : modelHeader,
                    objDetail : modelDetail,
                    intLine : intLine
                }),
            cache: false,
            success: function (data) {
                @*window.location.replace('@Url.Action("Detail")');*@
                },
            error: function (data) {
                console.log(data);
            }
        });
    }

这是我的控制器:

[HttpPost]
    public ActionResult DeleteDetail(SampleHeaderViewModels objHeader, List<SampleDetailViewModels> objDetail, int intLine)
    {
        objDetail.Remove(objDetail.Where(m => m.intLine == intLine).FirstOrDefault());

        SampleViewModels obj = new SampleViewModels();
        obj.Header = objHeader;
        obj.Detail = objDetail;

        TempData["model"] = obj;

        return View("Index", obj);
    }

问题是: 在我的代码中,当我按下数据表中的“删除”按钮时,它将在 javascript 中调用函数 AJAX POST DeleteDetail。它会将 Header 模型和 Detail 模型发送到我的 Controller。我的控制器将删除选定的行并将模型返回给 View。我的 View 得到了最新的模型。已经删除了 1 行。 但它不会呈现数据表。所以删除的数据还在。 当 AJAX 成功时,我正在尝试使用 @url 发布页面,但仍然没有运气。 如何强制数据表绑定最新的模型?

谢谢。

已编辑:

我正在尝试刷新数据而不刷新页面。只需刷新数据表即可。

这是我的控制器:

public ActionResult DeleteDetail(SampleHeaderViewModels objHeader, List<SampleDetailViewModels> objDetail, int intLine)
    {
        objDetail.Remove(objDetail.Where(m => m.intLine == intLine).FirstOrDefault());

        SampleViewModels obj = new SampleViewModels();
        obj.Header = objHeader;
        obj.Detail = objDetail;

        TempData["model"] = obj;

        var json = JsonConvert.SerializeObject( new {detail = obj.Detail});

        return Content(json, "application/json");
    }

这是我的 Javascript:

function DeleteDetail(intLine)
    {
        debugger;
        var modelHeader = {
            "intID": $('#@Html.IdFor(m => m.Header.intID)').val(),
            "txtField1": $('#@Html.IdFor(m => m.Header.txtField1)').val(),
            "txtField2": $('#@Html.IdFor(m => m.Header.txtField2)').val(),
        };

        var modelDetail = @Html.Raw(JsonConvert.SerializeObject(Model.Detail));

        $.ajax({
            url: '/Sample/DeleteDetail',
            type: 'POST',
            datatype: 'JSON',
            contentType: 'application/json',
            data: JSON.stringify(
                {
                    objHeader : modelHeader,
                    objDetail : modelDetail,
                    intLine : intLine
                }),
            cache: false,
            success: function (data) {
                debugger;

                table = $("#tbDataTable").dataTable();
                oSettings = table.fnSettings();

                table.fnClearTable(this);

                for (var i=0; i < data.detail.length; i++)
                {
                    table.oApi._fnAddData(oSettings, data.detail[i]);
                    //this part always send error DataTables warning: table id=tbDataTable - Requested unknown parameter '0' for row 0.
                }

                oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
                table.fnDraw();

                },
            error: function (data) {
                console.log(data);
            }
        });
    }

但它向我发送了一个错误 DataTables 警告:table id=tbDataTable - Requested unknown parameter '0' for row 0。 视图和视图模型仍然与第一个问题相同。 请帮我。

【问题讨论】:

  • 删除记录成功后重新加载数据表
  • 我已经阅读了有关从服务器端重新加载数据表的信息。但我没有运气。也许我不明白这个概念。你能帮我完成上面的所有代码吗?
  • 你在使用jquery数据表插件吗??
  • 是的,我愿意。但我不太明白如何重新绑定数据表
  • 您正在使用强类型模式绑定显示列表,您需要在成功删除记录后重新加载页面

标签: c# jquery ajax asp.net-mvc datatable


【解决方案1】:

如果您成功地从数据库中删除了一条记录,则操作方法返回 true,否则返回 false:

 public ActionResult DeleteDetail(SampleHeaderViewModels objHeader, 
  List<SampleDetailViewModels> objDetail, int intLine)
  {
     ...
  ...
  db.SaveChanges();
  return Json(new { Success = true; });
  }

在ajax的成功方法中重新加载当前页面,

  success: function (data) {

  if(data.Success) {
   // reload you page through javacript/jquery
        window.location.reload();

        //location.reload(true);
    }

【讨论】:

  • 有什么办法可以在不刷新页面的情况下刷新表格?
  • 这取决于您在页面上加载列表的方式,如果您使用强类型,那么您必须重新加载您的页面。如果您通过 ajax 或任何 jquery 插件(如 datatable jquery 插件)加载列表。那么它不会重新加载页面。
  • 如果我将objDetail转换为JSON并返回它,我可以在不刷新页面的情况下绑定数据表吗?
  • 是的,您只需要重新加载/刷新数据表。无需重新加载页面
【解决方案2】:

jquery:

<script>
    var Display;

    $(document).ready(function () {

        $('#ProductTable').DataTable();

        Display = function () {
            var URL = '@Url.Action("GetProductsData", "Product")';

            oTable = $('#ProductTable').DataTable({
                dom: 'Bfrtip',
                "bPaginate": false,
                buttons: [
                    'excel', 'pdf', 'print'
                ],
                "processing": false,
                "serverSide": false,
                "bSort": false,
                "searching": true,
                "sAjaxSource": URL,
                "pageLength": 10,
                "bDestroy": true,
                "bLengthChange": true,
                "scrollX": true,
                "scrollY": ($(window).height() - 200),
                "pagingType": "full_numbers",
                "sEmptyTable": "Loading data from server",
                "fnServerData": function (sSource, aoData, fnCallback) {

                    $.ajax({
                        "dataType": 'json',
                        "type": "POST",
                        "url": sSource,
                        "data": aoData,
                        "success": fnCallback
                    });
                },
                "columns": [
                                  {

                                      "sWidth": "5%",
                                      "bSortable": true,
                                      "sClass": "TextCenter ID",
                                      "visible": false,
                                      "render": function (data, type, row, meta) {
                                          return (row[0])
                                      }
                                  },
                                  {

                                      "sWidth": "5%",
                                      "sClass": "rightalign ",
                                      "render": function (data, type, row, meta) {
                                          return (row[1])
                                      }
                                  },
                                   {

                                       "sWidth": "10%",
                                       "sClass": "rightalign TA_C",
                                       "render": function (data, type, row, meta) {
                                           return (row[2])
                                       }
                                   },

                                  {
                                      "swidth": "5%",
                                      "sclass": "TextCenter Action",
                                      "render": function (data, type, row, meta) {
                                          return '<button class="btn btn-primary fa fa-check-square"  title="Edit" onclick="editdata(' + row[0] + ',\'' + row[1] + '\',' + row[2] + ')"></button>' +
                                      '<button class="btn btn-danger glyphicon glyphicon-trash" title="Delete"  onclick="deletedata(' + row[0] + ')" style="margin-left: 10px;"></button>';

                                          }
                                  }


                ], "fnInitComplete": function (oSetting, json) {

                }
            });
        }



        Display();

        $("#btninsert").click(function () {


            var fdata = new FormData();

            fdata.append("id","0");
            fdata.append("pname",$("#txtpname").val());
            fdata.append("pprice", $("#txtpprice").val());


            $.ajax({
                url: '@Url.Action("InupProduct", "Product")',
                type: "POST",
                contentType: false, // Not to set any content header
                processData: false, // Not to process data
                data: fdata,
                success: function (result) {
                    if (result == 1) {

                        swal("Successfully Product Inserted!", "", "success", {
                            button: "Close",
                        });

                        clear();
                        Display();
                    }
                    else {

                        swal("Product Not Inserted!", "", "error", {
                            button: "Close",
                        });
                    }

                },
                error: function (err) {
                    alert(err.statusText);
                }
            });

        });


        $("#btnupdate").click(function () {
            var fdata = new FormData();

            fdata.append("id", $("#hdnID").val());
            fdata.append("pname", $("#txtuppname").val());
            fdata.append("pprice", $("#txtuppprice").val());


            $.ajax({
                url: '@Url.Action("InupProduct", "Product")',
                type: "POST",
                contentType: false, // Not to set any content header
                processData: false, // Not to process data
                data: fdata,
                success: function (result) {
                    if (result == 1) {

                        swal("Successfully Product Updated!", "", "success", {
                            button: "Close",
                        });
                        clear();
                        Display();
                        $('#mmd').modal('hide');

                    }
                    else {
                        swal("Product Not Updated!", "", "error", {
                            button: "Close",
                        });
                    }

                },
                error: function (err) {
                    alert(err.statusText);
                }
            });
        });

        function clear() {
            $("#txtpname").val("");
            $("#txtpprice").val("");
        }
    });

    function deletedata(ID) {
        bootbox.confirm({
            title: "Please Confirm",
            message: "Are you sure to delete this record.",
            buttons: {
                cancel: {
                    label: '<i class="fa fa-times"></i> Cancel'
                },
                confirm: {
                    label: '<i class="fa fa-check"></i> Confirm'
                }
            },
            callback: function (result) {
                if (result == true) {
                    var data = { "ID": ID };
                    $.ajax({
                        url: '@Url.Action("deleteRecord", "Product")',
                        type: "POST",
                        contentType: "application/json; charset=utf-8",
                        data: JSON.stringify(data),
                        dataType: "json",
                        success: function (response) {

                            if (response == 1) {
                                swal("Successfully Product Deleted!", "", "success", {
                                    button: "Close",
                                });

                                    Display();


                            }
                            else {
                                swal("Product Not Deleted!", "", "error", {
                                    button: "Close",
                                });

                            }
                        }
                    });
                }
            }
        });
    }

    function editdata(pid,pname,price)
    {

        $("#hdnID").val(pid);
        $("#txtuppprice").val(price);
        $("#txtuppname").val(pname);
        $('#mmd').modal();          
    }
</script>

<style>
    .dataTables_scrollBody{
            position: relative;
overflow: auto;
margin-top: -5%;
width: 100%;
height: 502px;
    }
</style>

【讨论】:

    【解决方案3】:
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
    
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    
    
    <script src="https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js"></script>
    <script src="https://cdn.datatables.net/1.10.16/js/dataTables.bootstrap.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/bootbox.js/4.4.0/bootbox.min.js"></script>
    <script src="https://unpkg.com/sweetalert@2.1.0/dist/sweetalert.min.js"></script>
    

    控制器: 公共 JsonResult GetProductsData(){ var alldata = dbobj.products.ToList();

            var result = from x in alldata
                         select new[]
                         {
                                Convert.ToString(x.pid),
                                Convert.ToString(x.pname),
                                Convert.ToString(x.pprice)
    
                         };
    
    
            return Json(new
            {
                aaData = result
            },
          JsonRequestBehavior.AllowGet);
    
        }
    
    
        public JsonResult deleteRecord(int ID)
        {
            try
            {
                var data = dbobj.products.Where(x => x.pid == ID).FirstOrDefault();
                dbobj.products.Remove(data);
                dbobj.SaveChanges();
                return Json(1, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                return Json(0, JsonRequestBehavior.AllowGet);
            }
        }
    
    }
    

    【讨论】:

    • 请给这个答案添加一些解释,让这个答案更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    相关资源
    最近更新 更多