我正在使用一些自定义WebParts开发一个Farm Solution(完全信任)。对于一个WebPart,我想要一些ajax行为,所以我想:为什么不使用JSOM API? 我的网站部分只想检索新的公告,所以我添加了一个新的WebPart(Farm Solution),一些HTML和以下的javascript
<script src="//ajax.aspnetcdn.com/ajax/4.0/1/MicrosoftAjax.js" type="text/javascript"></script>
<script type="text/javascript">
function retrieveListItems() {
SP.SOD.executeFunc('sp.js', 'SP.ClientContext', function () {
var ctx = SP.ClientContext.get_current();
var web = ctx.get_web();
var list = web.get_lists().getByTitle("Announcements");
ctx.load(list);
ctx.executeQueryAsync(
function () {
console.log(list.get_title());
},
function (sender, args) {
console.log(args.get_message());
}
);
});
}
在我的html中,我有一个调用js函数的链接:
<a onclick="retrieveListItems(); return false;">Call</a>
当我调用该功能时收到403 FORBIDDEN错误,谷歌浏览器控制台显示以下内容
/_vti_bin/client.svc/ProcessQuery 403 (FORBIDDEN)
executeRequest @ MicrosoftAjax.js:5
executeRequest @ MicrosoftAjax.js:5
invoke @ MicrosoftAjax.js:5
$31_0 @ sp.runtime.js:2
executeClientRequestAsync @ sp.runtime.js:2
executeQueryAsync @ sp.runtime.js:2
retrieveListItems @ default.aspx:1091
onclick @ default.aspx:1118
在Google Chrome控制台的NETWORK标签中,在PREVIEW(响应)中,我看到以下内容
[{SchemaVersion: "15.0.0.0", LibraryVersion: "15.0.4420.1017", ErrorInfo: {,…},…}]
0:{SchemaVersion: "15.0.0.0", LibraryVersion: "15.0.4420.1017", ErrorInfo: {,…},…}
ErrorInfo:{,…}
ErrorCode:-2130575251
ErrorMessage:"A validação de segurança para esta página não é válida e pode estar corrompida. Use o botão Voltar do navegador da Web para tentar realizar a operação novamente."
TRANSLATING: The security validation for this page is invalid and might be corrupted. Please use your web browser's Back button to try your operation again.
ErrorTypeName:"Microsoft.SharePoint.SPException"
ErrorValue:null
TraceCorrelationId:"78edb09d-fb1d-7012-0000-026d47d0154a"
LibraryVersion:"15.0.4420.1017"
SchemaVersion:"15.0.0.0"
TraceCorrelationId:"78edb09d-fb1d-7012-0000-026d47d0154a"
我做了一些研究,发现了一些与FormDigest有关的东西,所以我在我的HTML标记中搜索__REQUESTDIGEST并复制了它的值,称为函数,并意识到发送的摘要是不同的。它可能是问题的根源?
我做了更多研究,发现这个骗取RequestDigest的js函数:
function CustomUpdateFormDigest() {
if (window._spPageContextInfo != null) {
var $v_2 = window._spPageContextInfo;
var $v_3 = $v_2.webServerRelativeUrl;
var $v_4 = window._spFormDigestRefreshInterval;
UpdateFormDigest($v_3, $v_4);
}
}
在调用我的retrieveListItems()函数之前调用它但它不起作用。有人能指出我正确的方向吗?这真的是一个消化问题吗?
编辑:我意识到,如果我的网页有我的网页部分,当我点击链接并且如果我在谷歌Chrome控制台中执行脚本时,我会收到错误。如果我从页面中删除我的webpart,我可以成功地在Google Chrome控制台中执行该脚本。
答案 0 :(得分:1)
如果您要查询同一站点但是使用SP.ClientContext.get_current(),则不应该实例化新的上下文。
如果您正在查询另一个Web,那么您将必须处理一些身份验证和/或使用执行代理,具体取决于您正在执行的操作。请记住,查询到其他站点通常是一种不好的做法。你应该改用搜索
此外,您不应该引用SharePoint js文件,而是使用Script Demande(SOD)结构在调用您的库之前等待SharePoint准备就绪。
答案 1 :(得分:1)
找到了解决方案!
我以错误的方式引用了我的脚本 我是这样引用的:
<script src="//ajax.aspnetcdn.com/ajax/4.0/1/MicrosoftAjax.js" type="text/javascript"></script>
<script type="text/javascript" src="/_layouts/15/sp.runtime.js"> </script>
<script type="text/javascript" src="/_layouts/15/sp.js"> </script>
<script type="text/javascript" src="/_layouts/SP.debug.js"></script>
正确的方法是:
<script src="//ajax.aspnetcdn.com/ajax/4.0/1/MicrosoftAjax.js" type="text/javascript"></script>
<script type="text/javascript" src="/Style Library/Js/TopNavigation.js"> </script>
在我使用它时加载SP脚本,如下所示:
SP.SOD.executeFunc('sp.js', 'SP.ClientContext', function () {
// My code...
});