我正在使用IFD CRM2011环境,我正在关注this MSDN example查询ODATA端点以填充IFrame中的下拉菜单。
以下是填充下拉列表的代码:
function GetQuestionSetList() {
var query = '/Mhc_questionsetverSet?' +
'$select=Mhc_name,Mhc_questionsetverId&$filter=statecode/Value eq 0';
SDK.RestEndpointPaging
.RetrieveRecords(query, ProcessReturnedQuestionSetVersions);
}
function ProcessReturnedQuestionSetVersions(retrievedQuestionSets) {
for (var i = 0; i < retrievedQuestionSets.length; i++) {
var questionSet = retrievedQuestionSets[i];
var value = questionSet.Mhc_questionsetverId;
var name = questionSet.Mhc_name;
//add option to select list
$('#selectQuestionSetVersion').append($('<option>')
.attr('value', value)
.text(name));
}
}
执行SDK.RestEndpointPaging.RetrieveRecords(query, ProcessReturnedQuestionSetVersions);
行后,系统会提示我:
此时我可以输入我的凭据或按取消,然后填充下拉列表。在开发人员工具中,我在两种情况下都会注意到这个错误:
SCRIPT5022:抛出异常但未捕获
mhc_json2.js,第484行第13期
// If the text is not JSON parseable, then a SyntaxError is thrown.
throw new SyntaxError('JSON.parse'); //line 484
};
}
}());
我无法弄清楚为什么会出现此对话框或者为什么会抛出此错误。
答案 0 :(得分:2)
发布后,我碰巧检查了fiddler并发现了问题。在我的情况下,有两次拨打RetrieveRecords
。第一个调用返回状态200(成功),但第二个调用返回401。
以下是两个电话:
https://alpha.ftg.com:5556//xrmservices/2011/organizationdata.svc/Mhc_questionsetverSet?$select=Mhc_name,Mhc_questionsetverId&$filter=statecode/Value eq 0
<强> https://alpha.ftg.com:5556//xrmservices/2011/organizationdata.svchttps://alpha.ftg.com:5556/xrmservices/2011/organizationdata.svc/Mhc_questionsetverSet?$filter= statecode /值%20当量%200安培; $选择= Mhc_name,Mhc_questionsetverId&安培; $ skiptoken = 1, 'mhc_questionsetverid', '%7B3F737386-54DF-DE11-A55C-00155D020C0D%7D','%7B7AF1B564-C3BF-DD11-8209-000BCDC54FC9 %7D'
在第二次调用中,服务器+ odata端点连接两次。如果找到RetrieveRecordsCallback
参数,__next
函数应该剥离服务器和端点URL:
MSDN说明:
如果找到__next属性,则将带有$ skiptoken的新URL作为新的过滤器参数值传递回SDK.RestEndpointPaging.RetrieveRecords,以便为每组记录重复该过程,直到请求的总数为&gt;检索记录并且不再返回__next属性。
if (null != retrievedRecords.__next) {
// The existance of the '__next' property
//indicates that more records are available
// So the originating function is called again
//using the filter value returned
var filter = retrievedRecords.__next
.replace(SDK.RestEndpointPaging.GetODataPath(), "");
SDK.RestEndpointPaging.RetrieveRecords(filter, callback);
}
SDK.RestEndpointPaging.GetODataPath()
在网址的服务器端点和端点部分之间追加/
,但是当返回新的过滤器参数时,额外的/
已被剥离,因此{{ 1}}函数无法替换路径,第二次附加它。
修复很简单。只需将.replace
功能更改为:
SDK.RestEndpointPaging.GetODataPath()