【发布时间】:2015-11-13 16:46:46
【问题描述】:
在 Web 表单项目中,我正在使用 SQL 存储过程加载 jqGrid,其中我将数据作为 json 返回。在初始设置和测试期间,我返回了 85 行数据。然后我更改了导致返回 1,868 行的参数,但它没有显示在网格中。
在 Firebug 中调试时,我看到错误“字符串的长度超过了 maxJsonLength 属性上设置的值”。我通过在我的 webconfig 中设置 maxJsonLength="2147483647" 来修复它,如流行的 Stackovrflow 帖子中所示。
所以我的问题是导致错误的字符串是什么?是整个数据记录的长度,还是返回的其中一列的数据长度?
我已经看到 jqGrid 返回更多数据的示例。感谢您提供任何见解。
更新
我听取了 Olegs 的建议,并使用 Nuget 在我的项目中安装了 Newtonsoft.Json。然后我对我的代码进行了更改以使用它:
在代码隐藏 - .cs 我有这个:
using Newtonsoft.Json;
公共部分类 Default2 : System.Web.UI.Page {
[WebMethod]
public static string GetDataFromDB()
{
DataSet ds = new DataSet();
string con = System.Configuration.ConfigurationManager.ConnectionStrings["SQLCon"].ToString();
SqlConnection SCon = new SqlConnection(con);
SCon.Open();
SqlCommand sqlCmd = new SqlCommand("dbo.usp_GetProjectDetails", SCon);
sqlCmd.CommandType = CommandType.StoredProcedure;
sqlCmd.Parameters.Add("@ProjNum", SqlDbType.Int).Value = DBNull.Value;
sqlCmd.Parameters.Add("@TrakIt", SqlDbType.VarChar, 255).Value = DBNull.Value;
sqlCmd.Parameters.Add("@Title", SqlDbType.VarChar, 255).Value = DBNull.Value;
sqlCmd.Parameters.Add("@Status", SqlDbType.VarChar, 255).Value = DBNull.Value;
sqlCmd.Parameters.Add("@Dept", SqlDbType.Int).Value = DBNull.Value;
sqlCmd.Parameters.Add("@AssignTo", SqlDbType.Int).Value = DBNull.Value; //19;
sqlCmd.Parameters.Add("@RecDate", SqlDbType.DateTime).Value = DBNull.Value;
sqlCmd.Parameters.Add("@CmpDate", SqlDbType.DateTime).Value = DBNull.Value;
sqlCmd.Parameters.Add("@EndDate", SqlDbType.DateTime).Value = DBNull.Value;
sqlCmd.Parameters.Add("@ExComp", SqlDbType.Int).Value = DBNull.Value;
sqlCmd.Parameters.Add("@ExAcReq", SqlDbType.Int).Value = DBNull.Value;
SqlDataAdapter da = new SqlDataAdapter(sqlCmd);
da.Fill(ds);
SCon.Close();
return JsonConvert.SerializeObject(ds.Tables[0]);
}
.aspx 中的函数如下所示:
<script type="text/javascript">
$(document).ready(function () {
$.ajax({
type: "POST",
contentType: "application/json",
data: "{}",
url: "Default2.aspx/GetDataFromDB",
dataType: "json",
success: function (data) {
data = data.d;
$("#list1").jqGrid({
datatype: "local",
colNames: ["Project #", "Trak-It #", "Priority", "Title", "Status", "Department", "Assigned To", "Resource", "Requestor"],
colModel: [
{ name: 'Project Number', index: 'Project Number', width: 80, key: true, formatter: 'showlink', formatoptions: { baseLinkUrl: 'Details.aspx', target: '_new' } },
{ name: 'Trak-It #', index: 'Trak-It #', width: 80 },
{ name: 'Priority', index: 'Priority', width: 80 },
{ name: 'Title', index: 'Title', width: 200 },
{ name: 'Status', index: 'Status', width: 80 },
{ name: 'Department', index: 'Department', width: 180 },
{ name: 'Assigned To', index: 'Assigned To', width: 100 },
{ name: 'Resource', index: 'Resource', width: 160 },
{ name: 'Requestor', index: 'Requestor', width: 140 }
],
data: JSON.parse(data),
rowNum: 8,
rowList: [10, 20, 30],
pager: '#pager1',
caption: "Test Grid",
viewrecords: true,
ignoreCase: true,
async: true,
loadonce: true,
gridview: true,
width: 1000
});
}
});
});
</script>
最后在 Web.config 中,我注释掉了 maxjsonLength:
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="2147483647">
</jsonSerialization>
</webServices>
</scripting>
但我仍然收到错误 =“使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了 maxJsonLength 属性上设置的值。”
如果我取消注释 web.config 设置,它就可以正常工作。如果我将其注释掉并带回更少的数据,它就可以正常工作。我错过了什么?
【问题讨论】: