数据表错误:“请求的未知参数”
Posted
技术标签:
【中文标题】数据表错误:“请求的未知参数”【英文标题】:DataTables Error: "Requested unknown parameter" 【发布时间】:2012-07-13 09:33:10 【问题描述】:我是 DataTables jquery 插件的新手。在发现 IE 8 与 javascript 存在性能问题后,我决定改变使用 DataTables 进行服务器端处理的方式。我在加载 JSP 时收到此错误消息(我使用的是 Spring 3):
DataTables warning (table id = 'results_table'): Requested unknown parameter '0' from the data source for row 0
我在 Google 上四处搜索,发现该错误消息的许多原因归结为格式错误的 JSON,因此我找到了一种从 Spring 3 控制器函数输出 JSON 以查看它生成的 JSON 的方法,我将代码更改为让它与DataTables 网站所说的非常接近。
仍然不高兴,仍然收到错误消息。
我为 DataTables 找到的服务器端处理示例不包含用于指定客户端使用的列的代码,所以我认为我不需要它。是吗?
以下是我的 results.jsp 的相关部分:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>ACME: search results in a nice DataTables.net Plugin</title>
</head>
<body>
<link rel="stylesheet" type="text/css" href="css/jquery.dataTables.css" />
<script language = "JavaScript" type = "text/javascript" src = "../nsd/js/jquery-1.7.js"></script>
<script language = "JavaScript" type = "text/javascript" src = "../nsd/js/jquery.dataTables.js"></script>
<script type="text/javascript">
$(document).ready(function()
$('#results_table').dataTable(
"bProcessing": true,
"bServerSide": true,
"sScrollX": "600px",
"sServerMethod": "POST",
"sAjaxSource": "/acme/resultstable",
);
);
</script>
<form id="command" name="f" action="employee" method="post">
<div id = "results">
<table id = "results_table">
<thead>
<tr>
<th> </th>
<th>ID</th>
<th>NO_PRINT</th>
<th>Full Name</th>
<th>Email Address</th>
<th>Phone Number</th>
<th>Organization</th>
<th>Organization Code</th>
<th>Position</th>
<th>Employee Type</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</body>
</html>
这是我发送给它的 JSON 响应:
"sEcho" : 1,
"iTotalRecords" : 1,
"iTotalDisplayRecords" : 1,
"aaData" : [
"person_id" : "888888",
"ID" : "999999",
"no_print" : " ",
"fullname" : "Obama, Willard",
"email_address" : "<a href = \"mailto:barry@whitehouse.gov\">barry@whitehouse.gov</a>",
"current_phone_number" : "303-867-5309",
"title" : " ",
"office" : " ",
"position" : "Contractor",
"empl_code" : "CONT"
]
这是我用来通过 Jackson 发送 JSON 响应的 Spring 控制器函数。这包括输出我的 JSON 的代码,所以我可以看到它的样子。它输出到 stdout 的 JSON 和我发送回 DataTables 的 JSON 会不会有所不同?
@RequestMapping(value = "/resultstable", method = RequestMethod.POST)
public @ResponseBody LinkedHashMap resultstable(ModelMap model,
HttpSession session,
@RequestParam (required=true) int sEcho,
@RequestParam (required=true) int iDisplayStart,
@RequestParam (required=true) int iDisplayLength,
@RequestParam (required=true) int iColumns,
@RequestParam (required=true) int iSortCol_0,
@RequestParam (required=false)String sSortDir_0,
@RequestParam (required=true) String sSearch )
/*
**********************************************************************
** These come from the DataTables.net Jquery plugin on results.jsp
**********************************************************************
** sEcho, - just send it back, used by DataTables for synching
** iDisplayStart - index of the record to start with, ie 3 for the 3rd of 100 records
** iDisplayLength - number of records to send back starting with iDisplayStart
** iColumns - number of columns to be displayed in the table
** iSortCol_0 - the number of thee column to be sorted on
** sSortDir_0 - direction of sorting: asc or desc
** sSearch - from the search box, filter results further on this term
**********************************************************************
*/
String nextView = "results";
String usertype = (String)session.getAttribute("usertype");
Search search = new Search(usertype);
List<LinkedHashMap> records = null;
String results = null;
int number_of_records = (Integer)session.getAttribute("number_of_records_found");
ResultsView rv = new ResultsView();
ResultsScreenTableHolder rstrh = null;
SearchScreenDataHolder ssdh2 = (SearchScreenDataHolder)session.getAttribute("search_screen_data_holder");
ObjectMapper mapper = new ObjectMapper();
logger.debug("started");
logger.debug("sEcho, == " + sEcho );
logger.debug("iDisplayStart == " + iDisplayStart );
logger.debug("iDisplayLength == " + iDisplayLength );
logger.debug("iColumns == " + iColumns );
logger.debug("iSortCol_0 == " + iSortCol_0 );
logger.debug("sSortDir_0 == " + sSortDir_0 );
logger.debug("sSearch == " + sSearch );
try
records = search.searchForAnEmployee(ssdh2,usertype,sSearch,"asc",
iSortCol_0,iDisplayStart,
iDisplayLength);
LinkedHashMap lhm= new java.util.LinkedHashMap();
lhm.put("sEcho", sEcho);
lhm.put("iTotalRecords",number_of_records);
lhm.put("iTotalDisplayRecords",9);
lhm.put("aaData",records);
// convert user object to json string, and save to a file
mapper.writeValue(new File("c:\\Downloads\\rstrh.json.txt"), lhm);
// display to console
logger.debug("My JSON: " + mapper.defaultPrettyPrintingWriter().writeValueAsString(lhm));
catch (Exception e)
logger.debug("\n",e);
return lhm;
// end function
【问题讨论】:
这里的信息可能对您有所帮助.. ***.com/a/12985883/661584希望您能解决。克里斯 【参考方案1】:我也遇到了同样的警告,但原因不同。我的数据中有 null 值。 JSON 格式正确,但 DataTables 不知道显示 nulls 的默认规则。解决方案是使用 sDefaultContent 属性。
样本aaData:
aaData: [
"Field1": "Foo", "Field2":null ,
"Field1": "Bar", "Field2":null ,
]
然后在aoColumns上,可以使用如下属性:
aoColumns: [
"mData": "Field1", sDefaultContent: "n/a" ,
"mData": "Field2", sDefaultContent: ""
]
这不是您当前的问题,但您将来可能会遇到此问题。
希望这对您有所帮助。
【讨论】:
谢谢。这解决了我的问题。它只发生在 v1.9 上。对于 1.8,数据表仍然运行良好 这解决了我的问题。我表中的第一列与数据无关,但它显示了一个用于编辑当前记录的按钮。 非常有意义,json 不会在 null 值上解析。谢谢! 在aoColumns
中有null
值也会导致这种情况。这就是我的问题所在。
你在那里救了我。我知道答案已经过时了,但它仍然是相关的。我们遇到的情况是,列数据可能是也可能不是NULL
,并且DataTables 向我们的用户抛出了一个关于Requested unknown parameter
的丑陋警告消息,因为它是一个嵌套在空属性中的值。在这里设置默认值可以解决问题。【参考方案2】:
今天早上我也遇到了同样的问题。您需要拥有aoColumns
参数并使用mDataProp
如下所示:
https://gist.github.com/1660712
至少它解决了我的问题。
【讨论】:
【参考方案3】:sDefaultContent 选项仅阻止显示警报框。数据表将找不到显示空值的规则。
更改表中的空值将消除此警告..
【讨论】:
【参考方案4】:如果它对任何人有帮助,我会遇到类似的错误,因为我的 mRender 函数名称中有句点:My.Namespace.MyFunction(data, row);
此行:var a = _fnSplitObjNotation( src );
将其拆分为单独的对象,这显然会产生错误。
使用
My_Namespace_MyFunction(data, row);
另外,我在传递字符串函数名而不是 JavaScript 函数对象时注意到了这个错误。
【讨论】:
【参考方案5】:为避免此错误,您的表“th”列数应等于返回数据列(以数字为单位),在上述问题中为aaData。
"aaData" : [
[
"person_id" : "888888",
"ID" : "999999",
],
[
"person_id" : "8888889",
"ID" : "9999990",
]
]
这是从服务器端语言返回数据的正确格式。 我用同样的方法解决了我的问题。
【讨论】:
以上是关于数据表错误:“请求的未知参数”的主要内容,如果未能解决你的问题,请参考以下文章