javascript - 如何在完全信任的解决方案中通过 javascript 调用 Sharepoint 2013 API?

标签 javascript c# jquery sharepoint-2013 sharepoint-jsom

我正在开发一个带有一些自定义 WebPart 的农场解决方案(完全信任)。对于一个 WebPart,我想要一些 ajax 行为,所以我想:为什么不使用 JSOM API? 我的 web 部件只是想检索新的公告,所以我添加了一个新的 Web 部件(农场解决方案)、一些 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() 函数之前调用它,但它不起作用。任何人都可以指出我正确的方向吗?真的是消化问题吗?

编辑:我意识到如果我的页面有我的 web 部件,当我点击链接并且在 google chrome 控制台中执行脚本时,我会收到错误消息。如果我从页面中删除我的 webpart,我可以在 Google Chrome 控制台中成功执行脚本。

最佳答案

如果您针对同一站点进行查询,则不应实例化新上下文,而应使用 SP.ClientContext.get_current()。
如果您正在查询另一个网站,那么您将必须处理一些身份验证和/或使用执行代理,具体取决于您在做什么。请记住,查询不同的站点通常是一种不好的做法。您应该改用搜索。
此外,您不应引用 SharePoint js 文件,而应使用按需脚本 (SOD) 结构等待 SharePoint 准备就绪,然后再调用您的库。

关于javascript - 如何在完全信任的解决方案中通过 javascript 调用 Sharepoint 2013 API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40245609/

相关文章:

javascript - 内部组件无法正确渲染

Javascript 将innerHTML发送到服务器ASP.NET

c#,当只有 1 个读取器时,我一直捕获多个 MySQL 读取器异常

javascript - 单击绘图显示时使标志可见

jquery - 使用 jQuery 可拖动和可调整大小与 jquery 碰撞 1.0.1 的奇怪行为

jquery - 具有受限放置区的拖放

javascript - 无法使用 angular 2 指令将带有 Selenium 的文本输入到字段中

javascript - html 问题模板复选框

javascript - 使用 javascript 自定义大鼠标光标

c# - DataGridCell 的行索引