DataTables - 如何从 JSON 响应或其他 DataTables 参数修改无结果消息 (zeroRecords)

DataTables - How to Modify Message for No results (zeroRecords) from JSON response or another DataTables parameter

提问人:SoundWaves 提问时间:10/27/2023 更新时间:11/1/2023 访问量:35

问:

对于上下文: 我有一个使用 DataTable 的应用程序,它使用默认的搜索功能并且运行良好。但是,还有其他筛选器和权限限制来定义页面上显示的内容。我收到用户投诉说,当他们找不到现有项目时,他们想知道原因。

话虽如此,当发现零结果时,我可以轻松地创建自定义消息。但是,我不知道如何将其传递回 DataTable,以便可以显示它。

下面共享的代码使用处理程序来获取数据。在此示例中,我将自定义消息添加为字段并将其隐藏在屏幕上。但是,这显然不起作用,因为当没有记录时,没有记录显示:)。

这是我的处理程序和 ASPX 页面的代码。它更多的是参考,因为我知道这个策略是行不通的。

任何想法将不胜感激!

Public Sub ProcessRequest(context As HttpContext) Implements IHttpHandler.ProcessRequest
    Dim displayLength As Integer = Integer.Parse(context.Request("iDisplayLength"))
    Dim displayStart As Integer = Integer.Parse(context.Request("iDisplayStart"))
    Dim sortCol As Integer = Integer.Parse(context.Request("iSortCol_0"))
    Dim sortDir As String = context.Request("sSortDir_0")
    Dim search As String = context.Request("sSearch")

    Dim Name As String = context.Server.HtmlEncode(context.Request.Cookies("User_Profile")("User_Name"))
    Dim User_Name As String = FindName(Name)
    Dim User_Id As String = FindId(Name)
    Dim Area As String = context.Server.HtmlEncode(context.Request.Cookies("User_Profile")("Default_Area"))
    Dim Dept As String = ""
    Dim Status As String = ""
    Dim ViewMyWOs As String = "All"
    Try
        ViewMyWOs = context.Server.HtmlEncode(context.Request.Cookies("WOInfo")("SaveMyWO"))
    Catch ex As Exception
    End Try
    Try
        If Not context.Request.Cookies("userInfo") Is Nothing Then
            Dept = _
                 context.Server.HtmlEncode(context.Request.Cookies("userInfo")("SaveDeptQuery"))
            Status = _
                 context.Server.HtmlEncode(context.Request.Cookies("userInfo")("SaveStatusQuery"))
        End If
    Catch ex As Exception

    End Try
    Dim spName As String = "spGetWORKORDER"

    Dim cs As String = ConfigurationManager.ConnectionStrings("WorkOrdersConString").ConnectionString
    Dim listWOs As New List(Of WorkOrder)()
    Dim filteredCount As Integer = 0
    Using con As New SqlConnection(cs)
        Dim cmd As New SqlCommand(spName, con)
        cmd.CommandType = CommandType.StoredProcedure
        cmd.Parameters.AddWithValue("@DisplayLength", displayLength)
        cmd.Parameters.AddWithValue("@DisplayStart", displayStart)
        cmd.Parameters.AddWithValue("@SortCol", sortCol)
        cmd.Parameters.AddWithValue("@SortDir", sortDir)
        cmd.Parameters.AddWithValue("@Search", If(String.IsNullOrEmpty(search), Nothing, search))
        cmd.Parameters.AddWithValue("@Area", Area)
        cmd.Parameters.AddWithValue("@Dept", If((Dept = "All Departments"), Nothing, Dept))
        cmd.Parameters.AddWithValue("@Status", Status)
        cmd.Parameters.AddWithValue("@User_Name", User_Name)
        cmd.Parameters.AddWithValue("@User_Id", User_Id)
        cmd.Parameters.AddWithValue("@ViewMyWOs", ViewMyWOs)
        con.Open()
        Dim rdr As SqlDataReader = cmd.ExecuteReader()
        While rdr.Read()
            Dim workOrder As New WorkOrder()
            workOrder.WO_Id = Convert.ToInt32(rdr("WO_Id"))
            workOrder.Priority = rdr("Priority").ToString()
            workOrder.Date_Submitted = Convert.ToDateTime(rdr("Date_Submitted")).ToShortDateString
            workOrder.Submitted_By = rdr("Submitted_By").ToString()
            workOrder.Task = rdr("Task").ToString()
            workOrder.Material = rdr("Material").ToString()
            workOrder.ChargeNumber = rdr("ChargeNumber").ToString()
            workOrder.Summary = rdr("Summary").ToString()
            workOrder.Part_Number = rdr("Part_Number").ToString()
            workOrder.QTY = rdr("QTY").ToString()
            workOrder.Department = rdr("Department").ToString()
            workOrder.Machine = rdr("Machine").ToString()
            workOrder.Full_Name = rdr("Full_Name").ToString()
            workOrder.Status = rdr("Status").ToString()
            workOrder.Requested_Completion = Convert.ToDateTime(rdr("Requested_Completion")).ToShortDateString
            workOrder.Completion_Date = rdr("Completion_Date").ToString()
            If workOrder.Completion_Date <> "" Then
                workOrder.Completion_Date = Convert.ToDateTime(workOrder.Completion_Date).ToShortDateString
            End If

            workOrder.Late = DateTime.Compare(Convert.ToDateTime(workOrder.Requested_Completion), DateTime.Now.AddDays(-1))
            filteredCount = Convert.ToInt32(rdr("TotalCount"))
            Dim message As String = "No matching records found"
            If filteredCount = 0 Then
                'Modify message based on the reason for no results
                message = "I like to Party"
            End If
            workOrder.Message = message
            listWOs.Add(workOrder)
        End While
    End Using

    Dim result = New With { _
        Key .iTotalRecords = GetTotalCount(), _
        Key .iTotalDisplayRecords = filteredCount, _
        Key .aaData = listWOs _
    }


    Dim js As New JavaScriptSerializer()
    context.Response.Write(js.Serialize(result))
End Sub

和 ASPX 页面

$(document).ready(function () {
                var table = $('#npwoList').dataTable({
                    dom: 'Bfrtip',
                    columns: [
                        { 'data': 'WO_Id' },
                        { 'data': 'Priority' },
                        { 'data': 'Date_Submitted' },
                        { 'data': 'Submitted_By' },
                        { 'data': 'Task' },
                        { 'data': 'Material' },
                        { 'data': 'ChargeNumber' },
                        { 'data': 'Summary' },
                        { 'data': 'Part_Number' },
                        { 'data': 'QTY' },
                        { 'data': 'Department' },
                        { 'data': 'Machine' },
                        { 'data': 'Full_Name' },
                        { 'data': 'Status' },
                        { 'data': 'Requested_Completion' },
                        { 'data': 'Completion_Date' },
                        { 'data': 'Late' },
                        { 'data': 'Message' }
                    ],
                    columnDefs:
                        [
                            { //these columns are always visible
                                "targets": [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],  
                                "visible": true,
                                "orderable": true,
                                "sortable": true,
                                "searchable": true,
                            },
                            {  //these columns are always invisible
                                "targets": [16,17],
                                "visible": false,
                                "orderable": false,
                                "sortable": false,
                                "searchable": false
                            }
                        ],                        
                    bServerSide: true,
                    sAjaxSource: 'Handlers/WODataHandler.ashx',
                    deferRender: true,
                    lengthMenu: [
                    [25, 50, 100, 1000],
                    ['25 rows', '50 rows', '100 rows', 'Show all']
                    ],
                    buttons: ['pageLength',
                         {
                             extend: 'colvis',
                             collectionLayout: 'fixed two-column',
                             postfixButtons: ['colvisRestore']
                         }
                    ],
                    language: {
                        buttons: {
                            colvis: 'Hide/Show Columns'                                
                        },                            
                        zeroRecords: **Add Message Here!!**//$('#npwoList tbody tr:eq(2) td:eq(17)').text()
                    },
                    "scrolly": 400,
                    "stateSave": true,
                    "order": [[0, "desc"]],
                    "stateSaveParams": function (settings, data) {
                        data.start = 0;
                    },

                    fnRowCallback: function (row, data, displayIndex) {
                        var api = this.api();
                        if ($(api.cell(displayIndex, 13).node()).text() == 'In-Process' &&
                                $(api.cell(displayIndex, 16).node()).text() > 0) {
                            $(row).addClass('green');
                        }
                        if ($(api.cell(displayIndex, 13).node()).text() != 'Complete' &&
                                $(api.cell(displayIndex, 13).node()).text() == 'Waiting - Engineering' &&
                                    $(api.cell(displayIndex, 16).node()).text() >= 0){
                            $(row).addClass('blue');
                        }
                        if ($(api.cell(displayIndex, 13).node()).text() != 'Complete' &&
                                $(api.cell(displayIndex, 16).node()).text() < 0) {
                            $(row).addClass('red');
                        }
                        if ($(api.cell(displayIndex, 13).node()).text() != 'Complete' &&
                                $(api.cell(displayIndex, 13).node()).text() != 'In-Process' &&
                                $(api.cell(displayIndex, 16).node()).text() > 0) {
                            $(row).addClass('black');
                        }
                        if ($(api.cell(displayIndex, 13).node()).text() != 'Complete' &&
                                $(api.cell(displayIndex, 13).node()).text() == 'Monitor') {
                            $(row).addClass('blue');
                        }                            
                    }
                });
                $('#npwoList tbody').on('click', 'tr', function () {
                    var id = $('td', this).eq(0).text();
                    document.getElementById('<%=txtWorkOrderId.ClientID%>').value = id;
                    var clickButton = document.getElementById("<%= btnOpenNPWO.ClientID%>");
                    clickButton.click();
                });
            });               
asp.net json ajax vb.net 数据表

评论


答:

0赞 SoundWaves 11/1/2023 #1

好的,这里的解决方案非常简单。

步骤 1 - 向 JSON 响应添加一个参数,无论检索到的记录数量如何,该参数都将返回一个值。在这种情况下,我添加了imessage。

Dim result = New With {
        Key .iTotalRecords = GetTotalCount(),
        Key .iTotalDisplayRecords = filteredCount,
        Key .imessage = message,
        Key .aaData = listWOs
    }

要在客户端使用它,您需要将“zeroRecords”变量更改为函数。

language: {
    zeroRecords: function () {
        return function () {
            return $('#npwoList').DataTable().ajax.json().imessage;
        };
     }
 },