1

いくつかのカスタム Web パーツを使用してファーム ソリューション (完全信頼) を開発しています。1 つの WebPart について、いくつかの ajax 動作が必要なので、JSOM API を使用しないのはなぜでしょうか? 私の Web パーツは新しいお知らせを取得したいだけなので、新しい WebPart (ファーム ソリューション)、いくつかの 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 エラーが発生し、Google Chrome コンソールに次のように表示されます。

/_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 コンソールの [ネットワーク] タブの [プレビュー] (応答) に、次のように表示されます。

[{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 コンソールでスクリプトを実行すると、エラーが発生することに気付きました。ページから Web パーツを削除すると、Google Chrome コンソールでスクリプトを正常に実行できます。

4

2 に答える 2

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...
});
于 2016-10-26T20:07:14.130 に答える