ASP.NET Core 3.1中的数据表服务器端处理 代码

如何解决ASP.NET Core 3.1中的数据表服务器端处理 代码

通过AJAX调用,我对数据表不熟悉。我需要实现数千条记录的服务器端处理。我正在学习教程,但是在某些地方与服务器端处理相混淆。

尝试从数据源渲染数据时出现错误。让我发布所有相关代码,并希望您能帮助我确定错误之处。由于我是 Datatables 和Ajax的新手,所以我将不胜感激,提供了示例,文本答案以及代码或链接到教程的更多答案,这些教程或教程链接了 ASP.NET CORE 3.1中的服务器端处理。

感谢您的宝贵时间和帮助。

NB。我从一个教程中获取了实现和配置,并尝试对其进行自定义。

下面是HTML表及其模型:

@model IEnumerable<StudentApplications>
<table id="custom-datatable" class="mb-5 display table table-bordered" style="width:100%">
                <thead>
                    <tr>
                        <th>
                            @Html.DisplayNameFor(model => model.ApplicationId)
                        </th>
                        <th>
                            @Html.DisplayNameFor(model => model.Firstname)
                        </th>
                        <th>
                            @Html.DisplayNameFor(model => model.Surname)
                        </th>
                        <th>
                            @Html.DisplayNameFor(model => model.ApplicationFor)
                        </th>
                        <th>
                            @Html.DisplayNameFor(model => model.SubmissionDate)
                        </th>
                        <th></th>
                    </tr>
                </thead>
                <tfoot>
                    <tr>
                        <th>
                            @Html.DisplayNameFor(model => model.ApplicationId)
                        </th>
                        <th>
                            @Html.DisplayNameFor(model => model.Firstname)
                        </th>
                        <th>
                            @Html.DisplayNameFor(model => model.Surname)
                        </th>
                        <th>
                            @Html.DisplayNameFor(model => model.ApplicationFor)
                        </th>
                        <th>
                            @Html.DisplayNameFor(model => model.SubmissionDate)
                        </th>
                        <th></th>
                    </tr>
                </tfoot>
            </table>

以下是将HTML表初始化为数据表和某些配置的javascript文件:

$(document).ready(function () {
    $('#custom-datatable').DataTable({

        // Design Assets
        stateSave: true,autoWidth: true,// ServerSide Setups
        processing: true,serverSide: true,// Paging Setups
        paging: true,// Searching Setups
        searching: { regex: true },// Ajax Filter
        ajax: {
            url: "/myapplications/data",type: "POST",contentType: "application/json",dataType: "json",data: function (d) {
                return JSON.stringify(d);
            }
        },// Columns Setups
        columns: [
            { data: "ApplicationId" },{ data: "Firstname" },{ data: "Surname" },{ data: "ApplicationFor" },{ data: "SubmissionDate" }

            //// For Student.Id
            //{ "data": "applicationId","name": "ApplicationId" },//// For Student.Firstname
            //{ "data": "firstname","name": "Firstname" },//// For Student.Surname
            //{ "data": "surname","name": "Surname" },//// For Student.ApplicationFor
            //{ "data": "applicationFor","name": "ApplicationFor" },//// For Student.SubmissionDate
            //{ "data": "submissionDate","name": "SubmissionDate" }
        ],// Column Definitions
        columnDefs: [
            { targets: "no-sort",orderable: false },{ targets: "no-search",searchable: false },{
                targets: "trim",render: function (data,type,full,meta) {
                    if (type === "display") {
                        data = strtrunc(data,10);
                    }

                    return data;
                }
            },{ targets: "date-type",type: "date-eu" },{
                targets: 10,data: null,orderable: false
            },]
    });

});

以下是获取数据的方法:

// loading datatable
        [HttpPost]
        [Route("myapplications/data")]
        public async Task<IActionResult> Data([FromBody] DtParameters dtParameters)
        { 
            searchBy = dtParameters.Search?.Value;

            // if we have an empty search then just order the results by Id ascending
            var orderCriteria = "ApplicationId";
            var orderAscendingDirection = true;

            if (dtParameters.Order != null)
            {
                // in this example we just default sort on the 1st column
                orderCriteria = dtParameters.Columns[dtParameters.Order[0].Column].Data;
                orderAscendingDirection = dtParameters.Order[0].Dir.ToString().ToLower() == "asc";
            }

            var result = context.AspNetStudentApplications.AsQueryable();

            if (!string.IsNullOrEmpty(searchBy))
            {
                result = result.Where(r => r.ApplicationId != null && r.ApplicationId.ToUpper().Contains(searchBy.ToUpper()) ||
                                           r.Firstname != null && r.Firstname.ToUpper().Contains(searchBy.ToUpper()) ||
                                           r.Surname != null && r.Surname.ToUpper().Contains(searchBy.ToUpper()) ||
                                           r.ApplicationFor != null && r.ApplicationFor.ToUpper().Contains(searchBy.ToUpper()) ||
                                           r.SubmissionDate != null && r.SubmissionDate.ToUpper().Contains(searchBy.ToUpper()));
            }

            result = orderAscendingDirection ? result.OrderByDynamic(orderCriteria,DtOrderDir.Asc) : result.OrderByDynamic(orderCriteria,DtOrderDir.Desc);

            // now just get the count of items (without the skip and take) - eg how many could be returned with filtering
            var filteredResultsCount = await result.CountAsync();
            var totalResultsCount = await context.AspNetStudentApplications.CountAsync();

            return Json(new DtResult<StudentApplications>
            {
                Draw = dtParameters.Draw,RecordsTotal = totalResultsCount,RecordsFiltered = filteredResultsCount,Data = await result
                    .Skip(dtParameters.Start)
                    .Take(dtParameters.Length)
                    .ToListAsync()
            });
        }

以下是DtParameters类和与数据表相关的其他类:

/// <summary>
/// A full result,as understood by jQuery DataTables.
/// </summary>
/// <typeparam name="T">The data type of each row.</typeparam>
public class DtResult<T>
{
    /// <summary>
    /// The draw counter that this object is a response to - from the draw parameter sent as part of the data request.
    /// Note that it is strongly recommended for security reasons that you cast this parameter to an integer,rather than simply echoing back to the client what it sent in the draw parameter,in order to prevent Cross Site Scripting (XSS) attacks.
    /// </summary>
    [JsonProperty("draw")]
    public int Draw { get; set; }

    /// <summary>
    /// Total records,before filtering (i.e. the total number of records in the database)
    /// </summary>
    [JsonProperty("recordsTotal")]
    public int RecordsTotal { get; set; }

    /// <summary>
    /// Total records,after filtering (i.e. the total number of records after filtering has been applied - not just the number of records being returned for this page of data).
    /// </summary>
    [JsonProperty("recordsFiltered")]
    public int RecordsFiltered { get; set; }

    /// <summary>
    /// The data to be displayed in the table.
    /// This is an array of data source objects,one for each row,which will be used by DataTables.
    /// Note that this parameter's name can be changed using the ajax option's dataSrc property.
    /// </summary>
    [JsonProperty("data")]
    public IEnumerable<T> Data { get; set; }

    /// <summary>
    /// Optional: If an error occurs during the running of the server-side processing script,you can inform the user of this error by passing back the error message to be displayed using this parameter.
    /// Do not include if there is no error.
    /// </summary>
    [JsonProperty("error",NullValueHandling = NullValueHandling.Ignore)]
    public string Error { get; set; }

    public string PartialView { get; set; }
}

/// <summary>
/// The additional columns that you can send to jQuery DataTables for automatic processing.
/// </summary>
public abstract class DtRow
{
    /// <summary>
    /// Set the ID property of the dt-tag tr node to this value
    /// </summary>
    [JsonProperty("DT_RowId")]
    public virtual string DtRowId => null;

    /// <summary>
    /// Add this class to the dt-tag tr node
    /// </summary>
    [JsonProperty("DT_RowClass")]
    public virtual string DtRowClass => null;

    /// <summary>
    /// Add the data contained in the object to the row using the jQuery data() method to set the data,which can also then be used for later retrieval (for example on a click event).
    /// </summary>
    [JsonProperty("DT_RowData")]
    public virtual object DtRowData => null;

    /// <summary>
    /// Add the data contained in the object to the row dt-tag tr node as attributes.
    /// The object keys are used as the attribute keys and the values as the corresponding attribute values.
    /// This is performed using using the jQuery param() method.
    /// Please note that this option requires DataTables 1.10.5 or newer.
    /// </summary>
    [JsonProperty("DT_RowAttr")]
    public virtual object DtRowAttr => null;
}

/// <summary>
/// The parameters sent by jQuery DataTables in AJAX queries.
/// </summary>
public class DtParameters
{
    /// <summary>
    /// Draw counter.
    /// This is used by DataTables to ensure that the Ajax returns from server-side processing requests are drawn in sequence by DataTables (Ajax requests are asynchronous and thus can return out of sequence).
    /// This is used as part of the draw return parameter (see below).
    /// </summary>
    public int Draw { get; set; }

    /// <summary>
    /// An array defining all columns in the table.
    /// </summary>
    public DtColumn[] Columns { get; set; }

    /// <summary>
    /// An array defining how many columns are being ordering upon - i.e. if the array length is 1,then a single column sort is being performed,otherwise a multi-column sort is being performed.
    /// </summary>
    public DtOrder[] Order { get; set; }

    /// <summary>
    /// Paging first record indicator.
    /// This is the start point in the current data set (0 index based - i.e. 0 is the first record).
    /// </summary>
    public int Start { get; set; }

    /// <summary>
    /// Number of records that the table can display in the current draw.
    /// It is expected that the number of records returned will be equal to this number,unless the server has fewer records to return.
    /// Note that this can be -1 to indicate that all records should be returned (although that negates any benefits of server-side processing!)
    /// </summary>
    public int Length { get; set; }

    /// <summary>
    /// Global search value. To be applied to all columns which have searchable as true.
    /// </summary>
    public DtSearch Search { get; set; }

    /// <summary>
    /// Custom column that is used to further sort on the first Order column.
    /// </summary>
    public string SortOrder => Columns != null && Order != null && Order.Length > 0
        ? (Columns[Order[0].Column].Data +
           (Order[0].Dir == DtOrderDir.Desc ? " " + Order[0].Dir : string.Empty))
        : null;

    /// <summary>
    /// For Posting Additional Parameters to Server
    /// </summary>
    public IEnumerable<string> AdditionalValues { get; set; }

}

/// <summary>
/// A jQuery DataTables column.
/// </summary>
public class DtColumn
{
    /// <summary>
    /// Column's data source,as defined by columns.data.
    /// </summary>
    public string Data { get; set; }

    /// <summary>
    /// Column's name,as defined by columns.name.
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// Flag to indicate if this column is searchable (true) or not (false). This is controlled by columns.searchable.
    /// </summary>
    public bool Searchable { get; set; }

    /// <summary>
    /// Flag to indicate if this column is orderable (true) or not (false). This is controlled by columns.orderable.
    /// </summary>
    public bool Orderable { get; set; }

    /// <summary>
    /// Search value to apply to this specific column.
    /// </summary>
    public DtSearch Search { get; set; }
}

/// <summary>
/// An order,as sent by jQuery DataTables when doing AJAX queries.
/// </summary>
public class DtOrder
{
    /// <summary>
    /// Column to which ordering should be applied.
    /// This is an index reference to the columns array of information that is also submitted to the server.
    /// </summary>
    public int Column { get; set; }

    /// <summary>
    /// Ordering direction for this column.
    /// It will be dt-string asc or dt-string desc to indicate ascending ordering or descending ordering,respectively.
    /// </summary>
    public DtOrderDir Dir { get; set; }
}

/// <summary>
/// Sort orders of jQuery DataTables.
/// </summary>
public enum DtOrderDir
{
    Asc,Desc
}

/// <summary>
/// A search,as sent by jQuery DataTables when doing AJAX queries.
/// </summary>
public class DtSearch
{
    /// <summary>
    /// Global search value. To be applied to all columns which have searchable as true.
    /// </summary>
    public string Value { get; set; }

    /// <summary>
    /// true if the global filter should be treated as a regular expression for advanced searching,false otherwise.
    /// Note that normally server-side processing scripts will not perform regular expression searching for performance reasons on large data sets,but it is technically possible and at the discretion of your script.
    /// </summary>
    public bool Regex { get; set; }
}

这是我的空表:

Basic Datatable features have been applied

以下是我在尝试加载数据时遇到的错误:

This is the error I am getting when trying to load data

我在哪里弄错了?

这是发生异常的地方:

enter image description here

@HMZ实现,我看到空白记录(下图):

我看到此警报

The Alert

坚持处理

Stuck on processing

当行数更改时,我看到此空表:

Empty table

解决方法

您的代码需要改进:

    默认情况下,asp.net核心中的
  1. DataTable会以小写首字母表示json数据,因此您需要进行如下更改:

    列:[ {data:“ applicationId”}, {data:“ firstname”}, {数据:“姓”}, {data:“ applicationFor”}, {data:“ submissionDate”} ]

  2. 默认数据表包含分页,排序和搜索。

  3. 当我测试您的代码时,它将在前端收到以下错误消息(您可以在浏览器中按F12来检查错误消息)。不确定是否会收到此错误,因为DataTable的版本可能不同:

    TypeError:无法设置未定义的属性“ nTf”

我搜索了错误并得出结论,它是由表页脚中的th元素的数量与表头中的th元素的数量导致的结果。但是我发现{ {1}}和thead在您的代码中是相同的。

与传统的DataTable有点不同,您在tfootth的两端都有空的thead。因此,我尝试一下,然后在删除tfoot中的th,但保持tfoot中的th

thead

这是一个工作示例,如下所示:

型号:

<thead>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.ApplicationId)
        </th>
        ...
        <th></th>
    </tr>
</thead>
<tfoot>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.ApplicationId)
        </th>
        ....
        @*<th></th>*@  //remove this...
    </tr>
</tfoot>

查看:

public class StudentApplications
{
    public int ApplicationId { get; set; }
    public string Firstname { get; set; }
    public string Surname { get; set; }
    public string ApplicationFor { get; set; }
    public string SubmissionDate { get; set; }
}

控制器:

@model IEnumerable<StudentApplications>
<table id="custom-datatable" class="mb-5 display table table-bordered" style="width:100%">
     <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.ApplicationId)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Firstname)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Surname)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.ApplicationFor)
            </th>
            <th>
                Date
            </th>
            <th></th>
        </tr>
    </thead>
    <tfoot>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.ApplicationId)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Firstname)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Surname)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.ApplicationFor)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.SubmissionDate)
            </th>
            @*<th></th>*@
        </tr>
    </tfoot>
</table>
@section Scripts
{
    <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.20/css/jquery.dataTables.css">
    <script type="text/javascript" charset="utf8" src="https://cdn.datatables.net/1.10.20/js/jquery.dataTables.js"></script>
    <script>
        $(document).ready(function () {
            $('#custom-datatable').DataTable({
                ajax: {
                    url: "/Home/data",type:"POST"
                },columns: [
                    { data: "applicationId" },{ data: "firstname" },{ data: "surname" },{ data: "applicationFor" },{ data: "submissionDate" }
                ]

            });

        });
    </script>
}

Startup.cs:

[HttpPost]
public ActionResult Data()
{
    var model = new List<StudentApplications>()
    {
        new StudentApplications(){ ApplicationId=1,ApplicationFor="aa",Firstname="Rena",SubmissionDate="2020-8-9",Surname="Ni"},new StudentApplications(){ ApplicationId=2,ApplicationFor="bb",Firstname="Sherry",SubmissionDate="2020-10-7",Surname="Chen"},new StudentApplications(){ ApplicationId=3,ApplicationFor="cc",Firstname="Xing",SubmissionDate="2020-5-10",Surname="Zou"},new StudentApplications(){ ApplicationId=4,ApplicationFor="dd",Firstname="a",new StudentApplications(){ ApplicationId=5,ApplicationFor="ee",Firstname="b",Surname="sd"},new StudentApplications(){ ApplicationId=6,ApplicationFor="ff",Firstname="c",Surname="df"},new StudentApplications(){ ApplicationId=7,ApplicationFor="gg",Firstname="d",Surname="Zdfgou"},new StudentApplications(){ ApplicationId=8,ApplicationFor="hh",Firstname="e",Surname="dfg"},new StudentApplications(){ ApplicationId=9,ApplicationFor="ii",Firstname="f",new StudentApplications(){ ApplicationId=10,ApplicationFor="jj",Firstname="g",Surname="vbc"},new StudentApplications(){ ApplicationId=11,ApplicationFor="kk",Firstname="h",Surname="hj"},new StudentApplications(){ ApplicationId=12,ApplicationFor="ll",Firstname="i",Surname="hjk"},new StudentApplications(){ ApplicationId=13,ApplicationFor="mm",Firstname="j",Surname="tyu"},};
    return Json(new {Data = model});
}

结果:

enter image description here

,

我发现了问题。我缺少JsonSerializer,因此将其添加到Startup.cs类中。

此方法可以正常工作:

[HttpPost]
        public async Task<IActionResult> LoadTable([FromBody] DtParameters dtParameters)
        {
            var searchBy = dtParameters.Search?.Value;

            // if we have an empty search then just order the results by Id ascending
            var orderCriteria = "Id";
            var orderAscendingDirection = true;

            if (dtParameters.Order != null)
            {
                // in this example we just default sort on the 1st column
                orderCriteria = dtParameters.Columns[dtParameters.Order[0].Column].Data;
                orderAscendingDirection = dtParameters.Order[0].Dir.ToString().ToLower() == "asc";
            }

            var result = context.TestRegisters.AsQueryable();

            if (!string.IsNullOrEmpty(searchBy))
            {
                result = result.Where(r => r.Name != null && r.Name.ToUpper().Contains(searchBy.ToUpper()) ||
                                           r.FirstSurname != null && r.FirstSurname.ToUpper().Contains(searchBy.ToUpper()) ||
                                           r.SecondSurname != null && r.SecondSurname.ToUpper().Contains(searchBy.ToUpper()) ||
                                           r.Street != null && r.Street.ToUpper().Contains(searchBy.ToUpper()) ||
                                           r.Phone != null && r.Phone.ToUpper().Contains(searchBy.ToUpper()) ||
                                           r.ZipCode != null && r.ZipCode.ToUpper().Contains(searchBy.ToUpper()) ||
                                           r.Country != null && r.Country.ToUpper().Contains(searchBy.ToUpper()) ||
                                           r.Notes != null && r.Notes.ToUpper().Contains(searchBy.ToUpper()));
            }

            result = orderAscendingDirection ? result.OrderByDynamic(orderCriteria,DtOrderDir.Asc) : result.OrderByDynamic(orderCriteria,DtOrderDir.Desc);

            // now just get the count of items (without the skip and take) - eg how many could be returned with filtering
            var filteredResultsCount = await result.CountAsync();
            var totalResultsCount = await context.TestRegisters.CountAsync();

            return Json(new DtResult<TestRegister>
            {
                Draw = dtParameters.Draw,RecordsTotal = totalResultsCount,RecordsFiltered = filteredResultsCount,Data = await result
                    .Skip(dtParameters.Start)
                    .Take(dtParameters.Length)
                    .ToListAsync()
            });
        }

这些DtParameter正确:

public class DtResult<T>
    {
        /// <summary>
        /// The draw counter that this object is a response to - from the draw parameter sent as part of the data request.
        /// Note that it is strongly recommended for security reasons that you cast this parameter to an integer,rather than simply echoing back to the client what it sent in the draw parameter,in order to prevent Cross Site Scripting (XSS) attacks.
        /// </summary>
        [JsonProperty("draw")]
        public int Draw { get; set; }

        /// <summary>
        /// Total records,before filtering (i.e. the total number of records in the database)
        /// </summary>
        [JsonProperty("recordsTotal")]
        public int RecordsTotal { get; set; }

        /// <summary>
        /// Total records,after filtering (i.e. the total number of records after filtering has been applied - not just the number of records being returned for this page of data).
        /// </summary>
        [JsonProperty("recordsFiltered")]
        public int RecordsFiltered { get; set; }

        /// <summary>
        /// The data to be displayed in the table.
        /// This is an array of data source objects,one for each row,which will be used by DataTables.
        /// Note that this parameter's name can be changed using the ajax option's dataSrc property.
        /// </summary>
        [JsonProperty("data")]
        public IEnumerable<T> Data { get; set; }

        /// <summary>
        /// Optional: If an error occurs during the running of the server-side processing script,you can inform the user of this error by passing back the error message to be displayed using this parameter.
        /// Do not include if there is no error.
        /// </summary>
        [JsonProperty("error",NullValueHandling = NullValueHandling.Ignore)]
        public string Error { get; set; }

        public string PartialView { get; set; }
    }

    /// <summary>
    /// The additional columns that you can send to jQuery DataTables for automatic processing.
    /// </summary>
    public abstract class DtRow
    {
        /// <summary>
        /// Set the ID property of the dt-tag tr node to this value
        /// </summary>
        [JsonProperty("DT_RowId")]
        public virtual string DtRowId => null;

        /// <summary>
        /// Add this class to the dt-tag tr node
        /// </summary>
        [JsonProperty("DT_RowClass")]
        public virtual string DtRowClass => null;

        /// <summary>
        /// Add the data contained in the object to the row using the jQuery data() method to set the data,which can also then be used for later retrieval (for example on a click event).
        /// </summary>
        [JsonProperty("DT_RowData")]
        public virtual object DtRowData => null;

        /// <summary>
        /// Add the data contained in the object to the row dt-tag tr node as attributes.
        /// The object keys are used as the attribute keys and the values as the corresponding attribute values.
        /// This is performed using using the jQuery param() method.
        /// Please note that this option requires DataTables 1.10.5 or newer.
        /// </summary>
        [JsonProperty("DT_RowAttr")]
        public virtual object DtRowAttr => null;
    }

    /// <summary>
    /// The parameters sent by jQuery DataTables in AJAX queries.
    /// </summary>
    public class DtParameters
    {
        //public DtParameters()
        //{
        //    Search = new DtSearch();
        //    Search.Value = "";
        //}

        /// <summary>
        /// Draw counter.
        /// This is used by DataTables to ensure that the Ajax returns from server-side processing requests are drawn in sequence by DataTables (Ajax requests are asynchronous and thus can return out of sequence).
        /// This is used as part of the draw return parameter (see below).
        /// </summary>
        public int Draw { get; set; }

        /// <summary>
        /// An array defining all columns in the table.
        /// </summary>
        public DtColumn[] Columns { get; set; }

        /// <summary>
        /// An array defining how many columns are being ordering upon - i.e. if the array length is 1,then a single column sort is being performed,otherwise a multi-column sort is being performed.
        /// </summary>
        public DtOrder[] Order { get; set; }

        /// <summary>
        /// Paging first record indicator.
        /// This is the start point in the current data set (0 index based - i.e. 0 is the first record).
        /// </summary>
        public int Start { get; set; }

        /// <summary>
        /// Number of records that the table can display in the current draw.
        /// It is expected that the number of records returned will be equal to this number,unless the server has fewer records to return.
        /// Note that this can be -1 to indicate that all records should be returned (although that negates any benefits of server-side processing!)
        /// </summary>
        public int Length { get; set; }

        /// <summary>
        /// Global search value. To be applied to all columns which have searchable as true.
        /// </summary>
        public DtSearch Search { get; set; }

        /// <summary>
        /// Custom column that is used to further sort on the first Order column.
        /// </summary>
        public string SortOrder => Columns != null && Order != null && Order.Length > 0
            ? (Columns[Order[0].Column].Data +
               (Order[0].Dir == DtOrderDir.Desc ? " " + Order[0].Dir : string.Empty))
            : null;

        /// <summary>
        /// For Posting Additional Parameters to Server
        /// </summary>
        public IEnumerable<string> AdditionalValues { get; set; }

    }

    /// <summary>
    /// A jQuery DataTables column.
    /// </summary>
    public class DtColumn
    {
        /// <summary>
        /// Column's data source,as defined by columns.data.
        /// </summary>
        public string Data { get; set; }

        /// <summary>
        /// Column's name,as defined by columns.name.
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// Flag to indicate if this column is searchable (true) or not (false). This is controlled by columns.searchable.
        /// </summary>
        public bool Searchable { get; set; }

        /// <summary>
        /// Flag to indicate if this column is orderable (true) or not (false). This is controlled by columns.orderable.
        /// </summary>
        public bool Orderable { get; set; }

        /// <summary>
        /// Search value to apply to this specific column.
        /// </summary>
        public DtSearch Search { get; set; }
    }

    /// <summary>
    /// An order,as sent by jQuery DataTables when doing AJAX queries.
    /// </summary>
    public class DtOrder
    {
        /// <summary>
        /// Column to which ordering should be applied.
        /// This is an index reference to the columns array of information that is also submitted to the server.
        /// </summary>
        public int Column { get; set; }

        /// <summary>
        /// Ordering direction for this column.
        /// It will be dt-string asc or dt-string desc to indicate ascending ordering or descending ordering,respectively.
        /// </summary>
        public DtOrderDir Dir { get; set; }
    }

    /// <summary>
    /// Sort orders of jQuery DataTables.
    /// </summary>
    public enum DtOrderDir
    {
        Asc,Desc
    }

    /// <summary>
    /// A search,as sent by jQuery DataTables when doing AJAX queries.
    /// </summary>
    public class DtSearch
    {
        /// <summary>
        /// Global search value. To be applied to all columns which have searchable as true.
        /// </summary>
        public string Value { get; set; }

        /// <summary>
        /// true if the global filter should be treated as a regular expression for advanced searching,false otherwise.
        /// Note that normally server-side processing scripts will not perform regular expression searching for performance reasons on large data sets,but it is technically possible and at the discretion of your script.
        /// </summary>
        public bool Regex { get; set; }
    }

此数据表配置正确:

$(document).ready(function () {
    $("#demoTable").DataTable({
        // Design Assets
        stateSave: true,autoWidth: true,// ServerSide Setups
        processing: true,serverSide: true,// Paging Setups
        paging: true,// Searching Setups
        searching: { regex: true },// Ajax Filter
        ajax: {
            url: "/TestRegisters/LoadTable",type: "POST",contentType: "application/json",dataType: "json",data: function (d) {
                return JSON.stringify(d);
            }
        },// Columns Setups
        columns: [
            { data: "id" },{ data: "name" },{ data: "firstSurname" },{ data: "secondSurname" },{ data: "street" },{ data: "phone" },{ data: "zipCode" },{ data: "country" },{ data: "notes" },{ data: "creationDate" }
        ]
    });
});

这是我刚开始进行工作时就遗漏的单行代码:

 services.AddControllers().AddJsonOptions(options => options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()));

添加JsonSerializer后,我得到以下结果: result

,

这是Datatables服务器端处理的工作示例。这是一个示例,可能需要修改才能在您的应用程序中工作。

代码

Datatables表参数:

[ModelBinder(BinderType = typeof(DataTableModelBinder))]
public class DataTablesResult
{
    public int Draw { get; set; }
    public int Start { get; set; }
    public int Length { get; set; }
    public Search Search { get; set; }
    public List<ColumnOrder> Order { get; set; }
    public List<Column> Columns { get; set; }
}

public class Search
{
    public string Value { get; set; }
    public bool Regex { get; set; }
}

public class Column
{
    public string Data { get; set; }
    public string Name { get; set; }
    public bool Searchable { get; set; }
    public bool Orderable { get; set; }
    public Search Search { get; set; }
}

public class ColumnOrder
{
    public int Column { get; set; }
    public string Dir { get; set; }
}

自定义模型绑定程序,以便在服务器端使用DataTablesResult正确绑定表参数:

public class DataTableModelBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        var request = bindingContext.HttpContext.Request;

        // Retrieve request data
        var draw = Convert.ToInt32(request.Query["draw"]);
        var start = Convert.ToInt32(request.Query["start"]);
        var length = Convert.ToInt32(request.Query["length"]);

        // Search
        var search = new Search
        {
            Value = request.Query["search[value]"],Regex = Convert.ToBoolean(request.Query["search[regex]"])
        };

        // Order
        var o = 0;
        var order = new List<ColumnOrder>();
        while (!StringValues.IsNullOrEmpty(request.Query["order[" + o + "][column]"]))
        {
            order.Add(new ColumnOrder
            {
                Column = Convert.ToInt32(request.Query["order[" + o + "][column]"]),Dir = request.Query["order[" + o + "][dir]"]
            });
            o++;
        }

        // Columns
        var c = 0;
        var columns = new List<Column>();
        while (!StringValues.IsNullOrEmpty(request.Query["columns[" + c + "][name]"]))
        {
            columns.Add(new Column
            {
                Data = request.Query["columns[" + c + "][data]"],Name = request.Query["columns[" + c + "][name]"],Orderable = Convert.ToBoolean(request.Query["columns[" + c + "][orderable]"]),Searchable = Convert.ToBoolean(request.Query["columns[" + c + "][searchable]"]),Search = new Search
                {
                    Value = request.Query["columns[" + c + "][search][value]"],Regex = Convert.ToBoolean(request.Query["columns[" + c + "][search][regex]"])
                }
            });
            c++;
        }

        var result = new DataTablesResult
        {
            Draw = draw,Start = start,Length = length,Search = search,Order = order,Columns = columns
        };

        bindingContext.Result = ModelBindingResult.Success(result);
        return Task.CompletedTask;
    }
}

服务器端操作:

[HttpGet]
public async Task<IActionResult> DataAjax(DataTablesResult tableParams)
{
    var query = dataWrapper.YourDataSet.GetAll();

    var totalCount = await query.CountAsync();

    if (tableParams.Search != null)
        query = query.Where(c => c.Firstname.Contains(tableParams.Search.Value)
        || c.Surname.Contains(tableParams.Search.Value));
       //Other search queries goes here

    if (tableParams.Order.Count > 0)
    {
        if (tableParams.Order[0].Dir == "asc")
            query = query.OrderBy(c => EF.Property<string>(c,tableParams.Columns[tableParams.Order[0].Column].Name));
        else
            query = query.OrderByDescending(c => EF.Property<string>(c,tableParams.Columns[tableParams.Order[0].Column].Name));
    }
    //In this example multi order is disabled so we can order by any column dynamically

    var result = await query.AsNoTracking().Select(E => new { Count = query.Count(),E = E }).Skip(tableParams.Start).Take(tableParams.Length).ToListAsync();
    var pureData = result.Select(E => E.E);

    if (result.Count == 0)
        return Ok(new { tableParams.Draw,recordsTotal = 0,recordsFiltered = 0,data = Enumerable.Empty<string>() });

    return Ok(new { tableParams.Draw,recordsTotal = totalCount,recordsFiltered = result.Select(c => c.Count).FirstOrDefault(),data = pureData });
}

数据表配置:

var table = $("#dataTable").DataTable({
    serverSide: true,processing: true,ajax: {
        url: "/Controller/DataAjax",method: "GET",dataType: "json"
    },select: true,orderMulti: false,//Multi column order is disabled
    columnDefs: [{
        targets: [],//Here you can specify targets for cell ellipsis
        render: $.fn.dataTable.render.ellipsis(10,true)
    },{
        targets: [],//Disable search on targeted columns
        searchable: false
    },//Disable order on targeted columns
        orderable: false
    }],columns: [
        { "name": "ApplicationId" } //Here your column names should match your db columns in order to have dynamic order.
    ]
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-