如何在 mvc 中使用 ajax 将数据加载到数据表中

Posted

技术标签:

【中文标题】如何在 mvc 中使用 ajax 将数据加载到数据表中【英文标题】:How to load data into datatable using ajax in mvc 【发布时间】:2019-08-21 04:18:30 【问题描述】:

我正在使用 ajax 将数据库中的对象列表加载到数据表中。调试时,我的MVC动作结果好像查询数据没问题,但是datatable列显示为null

我尝试在 MVC 操作中返回列表之前对其进行序列化,但它没有解决问题

// Code from View

<table class="table table-striped" id="codetable">
<thead>
    <tr>
        <td>Student Number</td>
        <td>Student</td>
        <td>Faculty</td>
        <td>Department</td>
        <td>Program</td>
        <td>Code</td>
    </tr>
</thead>
<tbody>

</tbody>
</table>

<script>
    $(document).ready(function () 
        $("#codetable").DataTable(
            processing: true,
            serverSide: true,
            info: true,
            ajax: 
                url: '@Url.Action("GetVoters", "Index")',
                dataSrc: ""
            ,

            Columns: [
                 "data": "StudentNumber" ,
                 "data": "Name" ,
                 "data": "Faculty" ,
                 "data": "Department" ,
                 "data": "Program" ,
                 "data": "Code" 
            ]
        );
    );
</script>


//Code from Controller

public JsonResult GetVoters()

List<vt> stud = (from student in _context.Voters
                      select new vt
                      
                          StudentNumber = student.StudentNumber,
                          Name = student.Name,
                          Faculty = student.Faculty,
                          Department = student.Department,
                          Program = student.Program,
                          Code = student.Code
                      ).Take(100).ToList();
        var js = new System.Web.Script.Serialization.javascriptSerializer();
        var result = js.Serialize(stud);
        return Json(result, JsonRequestBehavior.AllowGet);
    

public class vt

    public string StudentNumber  get; set; 
    public string Name  get; set; 
    public string Faculty  get; set; 
    public string Department  get; set; 
    public string Program  get; set; 
    public string Code  get; set; 

我希望表格显示列表中的各个列,但会引发此错误“DataTables 警告:表格 id=codetable - 请求第 0 行、第 1 列的未知参数 '1'...”并仅在第一列(因此每行一个字符)。其余列显示为空

Displayed Error

【问题讨论】:

完成您的代码。 Atction、ajax、数据表渲染 【参考方案1】:

更新

我找到了一种更好的方法来使用 AJAX 处理来自控制器的源数据。请将此方法用于带有 AJAX 的 DataTable 网格:

为了在您的 DataTable 插件中通过 AJAX 显示您的数据,请在您的代码中进行以下更改:

添加一个名为DataTable的模型

public class DataTable

    public List<vt> data  get; set; 

然后在你的控制器中:

public JsonResult GetVoters()

 DataTable dataTable = new DataTable();
 List<vt> stud = (from student in _context.Voters
                      select new vt
                      
                          StudentNumber = student.StudentNumber,
                          Name = student.Name,
                          Faculty = student.Faculty,
                          Department = student.Department,
                          Program = student.Program,
                          Code = student.Code
                      ).Take(100).ToList();
    //The magic happens here
    dataTable.data = stud;
    return Json(dataTable, JsonRequestBehavior.AllowGet);
  

最后在你的视图中,使用这个脚本来填充你的数据表:

 <script type="text/javascript">
    $(document).ready(function () 

        //For filtering:
        $('#codetable thead tr').clone(true).appendTo('#codetable thead');
        $('#codetable thead tr:eq(1) th').each(function (i) 
            var title = $(this).text();
            $(this).html('<input type="text" placeholder="Search ' + title + '" />');

            $('input', this).on('keyup change', function () 
                if (table.column(i).search() !== this.value) 
                    table
                        .column(i)
                        .search(this.value)
                        .draw();
                
            );
        );

        var table=$('#codetable').DataTable(
            "ajax": '@Url.Action("GetVoters", "Index")',
            "columns": [
                 "data": "StudentNumber" ,
                 "data": "Name" ,
                 "data": "Faculty" ,
                 "data": "Department" ,
                 "data": "Program" ,
                 "data": "Code" 
            ]
        );
    );
</script>

我差点忘了,为了过滤目的,改变你的 HTML 表格的结构:

<table class="table table-striped" id="codetable">
        <thead>
            <tr>
                <th>Student Number</th>
                <th>Student</th>
                <th>Faculty</th>
                <th>Department</th>
                <th>Program</th>
                <th>Code</th>
            </tr>
        </thead>
        <tbody></tbody>
</table>

我已使用带有 AJAX objects 的 DataTables 作为您网格的数据源。

干杯。

【讨论】:

数据加载正常,谢谢,但搜索和分页不起作用,尽管我已将 bFilter 设置为 true 您必须明确添加这些过滤器,其中也包括您的搜索。由于您将数据发布到服务器,因此您需要从列表中过滤和搜索。 @Shagragada 请通过搜索和过滤找到更新的答案以及通过 AJAX 初始化 DataTable 的更好方法。 请为此发布一个新问题。 数据没有为我加载@Rahul Sharma,没有任何错误【参考方案2】:

当我从 API 而不是控制器读取数据时,它也有效。在这种情况下,DataTables 保留了其默认的过滤、​​排序和分页。调试时,API 和 Controller JsonResult 返回的数据格式看起来是一样的。我真的无法解释为什么 API 可以工作,但控制器却不能。

//The API Code

public IEnumerable<vt> GetStudents()
    
        return _context.Voters.Select(x=>new vt  StudentNumber = x.StudentNumber, Name = x.Name, Faculty = x.Faculty, Department = x.Department, Program = x.Program, Code = x.Code ).ToList();
    



//The only change in the jquery script is the url which now points to the API

<script>
$(document).ready(function () 
    $("#codetable").DataTable(
        processing: true,
        serverSide: true,
        info: true,
        ajax: 
            url: "/api/Students",
            dataSrc: ""
        ,

        Columns: [
             "data": "StudentNumber" ,
             "data": "Name" ,
             "data": "Faculty" ,
             "data": "Department" ,
             "data": "Program" ,
             "data": "Code" 
        ]
    );
);

【讨论】:

此链接将让您深入了解 API 在这种情况下工作的原因:***.com/questions/9494966/…

以上是关于如何在 mvc 中使用 ajax 将数据加载到数据表中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Asp.Net MVC5 中使用 Ajax 将数据库更改保存到拖放列表

如何在 ASP.NET MVC 中使用 jQuery ajax 方法将数据列表发送到控制器操作方法?

如何使用 AJAX 将数据发布到 ASP.NET MVC 控制器?

如何将图像文件和表单数据从 Ajax 传递到 MVC 控制器

如何使用 ajax 调用将 jquery 数据表加载到 div 中

如何在不重新加载页面的情况下使用 ASP.NET MVC 5 将数据导出到 Excel?