【发布时间】: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