【问题标题】:AJAX returns different values for same parametersAJAX 为相同的参数返回不同的值
【发布时间】:2020-10-28 14:05:23
【问题描述】:

我在 MVC 应用程序中遇到了一个非常奇怪的问题。

我在 IIS 环境 (IIS v8.5.9600.16384) 上部署了一个应用程序,它使用标准的 jQuery DataTable。传递的参数直接插入到控制器端的方法和类函数中,以从 SQL Server 获取数据。

当同时使用它的用户数量较少时,它工作得很好。但是,当用户数量增加时,当我调用有问题的表的 AJAX 重新加载时,我开始看到不稳定的数据——要么被过滤掉,要么根本没有——即使我的 jQuery DataTable 参数已通过(从控制台检查) ,SQL表中的数据不变。

因此,如果假定行数为 200,则当服务器活动减少或应用程序托管在克隆环境中时,它会在多个页面中显示 200 行。但是,当活动增加时,对于相同的输入参数,行数会发生很大变化(任何不是 200 的随机数,有时甚至是 0)。

这就是我的 DataTable 的样子:

 $('#tblGrid').DataTable({
            "createdRow": function (row, data, dataIndex) {
                 if (data.Incomplete == "Yes") {
                        $(row).css("color", "blue");
                    }
            },
            "scrollY": tableHeight,
            "iDisplayLength": displayLength,
            "fnDrawCallback": function () {
                var rowCount = $('#tblGrid tr').length;
                if (rowCount < displayLength) {
                    $('#divtblGrid').height(Math.floor((displayLength * 30) + 90));
                }
                else {
                    $('#divtblGrid').height("2%");
                }
            },
            "ajax": {
                type: 'POST',
                dataType: 'json',
                "url": '<%=Url.Action("ShowRecord","FrontOffice")%>',
                "dataSrc": function (json) {
                    if (json == "SessionExpired") {
                        location.href = '<%=Url.Action("LoginStart","Login")%>';
                    }
                    else {
                        return (JSON.parse(json));
                    }
                },
                "type": "POST",
                "contentType": "application/json",
                "data": function () {
                    return JSON.stringify({
                        "FromDate": $('#FromDate').val(),
                        "ToDate": $('#ToDate').val(),
                        "Department": $('#ddService').val()
                    })
                }
            },
            initComplete: function () {
                bindGridEvent();
                if (selectedRowName != undefined && $("#tblGrid").DataTable().row(selectedRow).node() != undefined) {
                    if ($("#tblGrid").DataTable().row(selectedRow).data().Name == selectedRowName) {
                        $("#tblGrid").DataTable().row(selectedRow).node().click();
                    }
                    else {
                        $("#tblGrid").DataTable().state.clear()
                        $("#tblGrid").DataTable().ajax.reload();
                    }
                }
            },
            "aoColumnDefs":
            [
               { "mData": "SNo", "aTargets": [0], "bSearchable": false, "sTitle": "SrNo" },                  
               { "mData": "Name", "aTargets": [1], "sTitle": "Name" },
               { "mData": "Age/Sex", "aTargets": [2], "sTitle": "Age/Gender" },
               { "mData": "MobileNo", "aTargets": [3], "sTitle": "Mobile No"},
               { "mData": "Incomplete", "aTargets": [4], "sTitle": "Incomplete"}
           ],
            stateSave: true,
            "stateDuration": 0,
            "stateSaveParams": function (settings, data) {
                data.FromDate = $("#FromDate").val();
                data.ToDate = $("#ToDate").val();
                data.Department = $('#ddService').val();
                if ($("tr.active").length > 0) {
                    data.selectedRow = $("#tblGrid").DataTable().row($("tr.active")).index();
                    data.selectedRowName = $("#tblGrid").DataTable().row($("tr.active")).data().Name;
                }
            },
            "stateLoadParams": function (settings, data) {
                $("#FromDate").val(data.FromDate);
                $("#ToDate").val(data.ToDate);
                data.Department = $('#ddService').val();
                selectedRow = data.selectedRow;
                selectedRowName = data.selectedRowName;
            }
        });
    });

这是我的控制器端方法的样子:

public JsonResult ShowRecord(string FromDate, string ToDate, string Department)
    {
        Employees objEmp = new Employees();
        DataTable dtGrid = objEmp.mShowRecords(FromDate, ToDate, Department);
        return Json(JsonConvert.SerializeObject(dtGrid, Formatting.None), JsonRequestBehavior.AllowGet);
    }

这就是我的班级的样子:

Public Function mShowRecords(ByVal sFromDate As String, ByVal sToDate As String, ByVal Department As String) As DataTable
            Dim sqlParam() As SqlParameter
            Dim dt As DataTable = Nothing
            ReDim sqlParam(3)
            sqlParam(0) = New SqlParameter("@FromDate", SqlDbType.VarChar)
            sqlParam(0).Value = GetDBDate(sFromDate)
            sqlParam(1) = New SqlParameter("@ToDate", SqlDbType.VarChar)
            sqlParam(1).Value = GetDBDate(sToDate)
            sqlParam(2) = New SqlParameter("@LoginName", SqlDbType.VarChar)
            sqlParam(2).Value = LoginUserDetails.LoginName
            sqlParam(3) = New SqlParameter("@Department", SqlDbType.SmallInt)
            If Department = "" Then
                sqlParam(3).Value = 0
            Else
                sqlParam(3).Value = Convert.ToInt16(Department)
            End If

            mShowRecords = ExecuteStoreProcDataTable("[sp_ShowEmployeeData]", sqlParam)
        End Function

(LoginUserDetails 是一个结构,用于存储用户从浏览器登录到应用程序时的特定信息。它在存储过程中用于检查登录用户的身份验证级别。)

我无法确定是否应该在 IIS 上检查某些内容(它运行的是默认设置,限制不变),因为相同的应用程序在没有活动时可以正常工作,或者它托管在第二个, 连接到相同数据库并使用相同文件的虚拟应用程序。我已经多次清除缓存,一次或两次都可以正常工作,之后再次抛出随机值。

非常感谢这方面的帮助,谢谢!

【问题讨论】:

    标签: jquery ajax iis model-view-controller datatables


    【解决方案1】:

    此问题可能与您在存储过程中的 SQL 语句有关。如使用 Row_Number 代替 Count(*) 作为计算条目的方式。大多数情况与 SQL 命令有关。看看这些链接。
    select query returns different results for the same query
    SQL Server/DB2: Same query returns different results?
    Same query giving different results

    【讨论】:

    • 谢谢!我检查了我的代码,结果发现问题是由结构(传递登录名)和过程(检查登录名的身份验证)引起的。当不同的用户登录时,该结构在其他地方被重置。用会话变量替换它对我有用!
    猜你喜欢
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多