我有一个jqGrid,它填充了来自服务器的自定义XML响应。我设法使用数据类型运行它:" xmlstring",当XML字符串在本地进行硬编码时,我还设法在从jqXHR.responseText的响应中获取XML时运行它,并将其作为一个XML字符串,仍然使用数据类型:" xmlstring",但是当我设置数据类型:" xml"时,我收到以下错误:
您的请求中发生错误:错误:无效的XML:
并且在错误之后列出了HTML页面的代码,它完成了所有这些,而不是XML响应,这对我来说似乎很奇怪。
当我设置数据时发生错误:数据或数据:jqXHR.responseText,甚至是数据:jqXHR.responseXML。
关于这个的任何想法?当使用数据类型:" xml"时,我应该为jqGrid数据传递什么 - data,jqXHR.responseText,jqXHR.responseXML或某些数据成员?
使用数据类型的好处是什么:" xml",而不是数据类型:" xmlstring"?如果我没有设法使用数据类型运行它:" xml",我可以使用数据类型:" xmlstring"使用来自响应的XML,这种方法会出现任何问题吗?
P.S。版本:jqGrid v.4.7.0,jQuery v.2.1.3,Firefox v.39.0和IE 11。
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
var columnNames = [ "User ID", "Organization", "Email" ];
var columnModels = [
{ name: "userId", visibility: "mandatory", index: "userId", width: 100, xmlmap: '>Reference[name="LogicalMember"]>Object[type="LogicalMember"]>Attribute[name="login"]'},
{ name: "organization", index: "organization", xmlmap:'>Reference[name="Organization"]>Object[type="Organization"]>Attribute[name="name"]' },
{ name: "email", index: "email", width: 80, xmlmap:'>Reference[name="EmailAddresses"]>Object[type="EmailAddress"]>Attribute[name="address"]'},
];
var filterModel = [
{ id: 'userId', name: 'User Id', renderer: 'text' },
{ id: 'organization', name: 'Organization', renderer: 'text', rendererOptions: { prompt: 'Domain*' } }
];
var xmlMapping = {root:"SearchResponse",
row:'SearchResponse>Object[type="Contact"]',
records:"SearchResponse[total-found]",
repeatitems:false,
id : "[id]"}
// PAGE INITIALIZATION
//------------------------------------------------------------------
$(document).ready( function() {
var searchRequest = createUserSearchRequest('', '', '', '', null, '', '', 50, 1);
var userSessionID = sessionStorage.getItem("UserSessionID");
$.ajax({
type : "POST",
dataType : "xml",
url : "../../../../api/",
headers: {
"UserSessionID": userSessionID,
"include_extended_attributes" : false,
"ClientVersion" : "3.0",
"ClientApplication" : "SomeApp",
"Content-type" : "text/xml"
},
data : searchRequest
})
.done(function (data, textStatus, jqXHR) {
var xml = jqXHR.responseText;
// Table ----------------------
var table = $("#table");
table.jqGrid(
{
data : data,
datatype: "xml",
colNames: columnNames,
colModel: columnModels,
multiselect: true,
fixedLoadingDiv: true,
onSelectRow: selectRow,
onSelectAll: selectAllRow,
columnChooserButtonVisible: true,
// Sort config
cmTemplate: { sortable: true },
sortname: "userId",
sortorder: "desc",
onSortCol: applySort,
xmlReader: xmlMapping,
emptyrecords: false,
columnsStateContextKey: "some.context",
fixedTableHeader: true
});
table.jqGrid('hideLoadingBar');
})
.fail(function (data, textStatus, jqXHR) {
alert("Server error!");
});
});
</script>
</head>
<body>
<div class="grid-content">
<table id="table"></table>
</div>
</body>
</html>
答案 0 :(得分:0)
我建议你做的第一件事就是验证你是否在页面上正确包含jQuery和jqGrid。您应该修改问题的文本,并包含有关您使用的jQuery和jqGrid的版本信息。了解哪个Web浏览器以及您用于测试的版本可能很重要。
我建议你做的下一件事是使用Fiddler或IE / Chrome / Firefox的开发者工具来跟踪服务器和客户端之间的HTTP流量。您应该检查服务器响应的确切正文和标题。您应该在问题的文本中包含这些信息。最重要的是:哪个值有Content-Type
标题。
还有一件事:您应该在调试器中启动HTML页面(按 F12 启动开发人员工具并启动脚本调试)。您将看到错误&#34;无效XML&#34;的确切位置。发生。您可以看到调用堆栈并执行已执行的jQuery或jqGrid行。如果你在你的所有测试中使用非最小化版本的jQuery和jqGrid,情况要好得多。
UPDATED :您发布的代码片段显示您以错误的方式使用jqGrid。首先,你误解了datatype
参数的含义。
选项datatype: "xml"
或datatype: "json"
应与url
参数结合使用。没有datatype: "xml"
的{{1}}表示您实现了数据的服务器端分页,而jqGrid应该发送到loadonce: true
个请求以加载每页数据。您未指定任何url
选项,因此将使用默认值rowNum
。在创建jqGrid期间,它会请求将网格填充到20
。如果未指定URL,则可能会对当前页面发出请求。
仅当您使用url
时,参数data
才会被jqGrid使用。 datatype: "local"
参数的值应该是带有表示网格行的元素的数组。
因此,如果您要从URL加载XML数据,则必须使用data
。如果您想单独请求URL,则应使用mtype: "POST", url: "../../../../api/", datatype: "xml", loadonce: true
。 datatype: "xml", datastr: data
可以是削减XML对象或带有XML数据的字符串。
如果您不从静态XML文件加载数据,我建议您使用JSON而不是XML。对于客户端和服务器端来说,它的速度更快。
更新2:您可以使用以下选项,例如
data