4

Sharepoint内にカスタムWebパーツがあり、Webパーツにいくつかのajaxを適用しようとしています。

同じコードは.netWebアプリケーション内では機能しますが、SharePointWebパーツ内では機能しません。

.net Webアプリケーションのコード(aspxページとその背後にあるコード)を以下に示します。これは正常に機能します。

ASPXファイル

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    CodeBehind="Default.aspx.cs" Inherits="WebApplication3._Default" %>

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
 <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
  // Add the page method call as an onclick handler for the div.
    $("#Result").click(function () {
        var loc = window.location.href;
    $.ajax({
      type: "POST",
      url: loc + "/GetMessage",
      data: "{}",
      contentType: "application/json; charset=utf-8",
      dataType: "json",
      success: function(msg) {
        // Replace the div's content with the page method's return.
        $("#Result").text(msg.d);
      }
    });
  });
});

   </script>
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <div id="Result">Click here for the time.</div>
    <asp:Button ID="btnClick" runat="server" Text="Button" />
</asp:Content>

.CSファイル

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Services;

namespace WebApplication3
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }
        [WebMethod]
        public static string GetMessage()
        {
            return "Codebehind method call...";
        }
        [WebMethod]
        public static string GetDate()
        {
            return DateTime.Now.ToString();
        }
    }
}

ポストバックを行わずにクリックすると、「ここをクリックしてください」というテキストが「メソッド呼び出しの背後にあるコード」に変わります。GetMessage()コードにステップインできます。これにより、.netWebアプリケーション内のコードビハインドのメソッドが呼び出されます。

ただし、これはSharePoint 2010内のWebパーツでは機能しません。誰かアイデアはありますか?

4

3 に答える 3

1

もう 1 つのオプションは、SharePoint アプリケーション ページを作成することです。以下は、アプリケーション ページとして機能するようにコードを少し変更したものです (SharePoint マスター ページのコンテンツ セクションを使用し、AJAX はアプリケーション ページを指しています)。

<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$" %>
<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Assembly Name="Microsoft.Web.CommandUI, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ApplicationPageWS.aspx.cs" Inherits="WebMethod.Layouts.WebMethod.ApplicationPageWS" DynamicMasterPageFile="~masterurl/default.master" %>


<asp:Content ID="PageHead" ContentPlaceHolderID="PlaceHolderAdditionalPageHead" runat="server">
<SharePoint:ScriptLink ID="ScriptLink1" runat="server" Localizable="false" Name="js/jquery-1.8.2.js"></SharePoint:ScriptLink>

<asp:Content ID="Main" ContentPlaceHolderID="PlaceHolderMain" runat="server">
<script type="text/javascript">
    $(document).ready(function () {
        // Add the page method call as an onclick handler for the div.
        $("#Result").click(function () {

            $.ajax({
                type: "POST",
                url: "**/_layouts/WebMethod/ApplicationPageWS.aspx/GetMessage**",
                data: "{}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (msg) {
                    $("#Result").text(msg.d);
                },
                error: function (msg) {
                    alert(msg.responseText);
                }
            });
        });
    });
</script>

<div id="Result">Click here for the time.</div>
<asp:Button ID="btnClick" runat="server" Text="Button" />

</asp:Content>

<asp:Content ID="PageTitle" ContentPlaceHolderID="PlaceHolderPageTitle" runat="server">
     Application Page
</asp:Content>

<asp:Content ID="PageTitleInTitleArea" ContentPlaceHolderID="PlaceHolderPageTitleInTitleArea" runat="server" >
    My Application Page
 </asp:Content>

次に、WebPart ではなく LayoutsPageBase から継承するようにサービス側を変更します。

using System;
using System.Web.UI;
using System.Web.Services;
using Microsoft.SharePoint.WebControls;

namespace WebMethod.Layouts.WebMethod
{
    public partial class ApplicationPageWS : LayoutsPageBase
    {
        protected override void OnInit(EventArgs e)
        {
             base.OnInit(e);
             //InitializeControl();
    }

    protected void Page_Load(object sender, EventArgs e)
    {

    }

    [WebMethod]
    public static string GetMessage()
    {
        return "Codebehind method call...";
    }

    [WebMethod]
    public static string GetDate()
    {
        return DateTime.Now.ToString();
    }
}

}

このソリューションがあなたの状況で機能することを願っています。そうでない場合、Web パーツから Web サービスを呼び出す必要がある場合は、Web パーツの外部で Web サービスを作成する必要があります。これはhttp://dbremes.wordpress.com/2011/01/03/ajax-style-web-parts-in-sharepoint-the-easy-way/でうまく説明されています

スティーブ

于 2012-11-20T06:21:21.577 に答える
0

最初に、必要なすべての js ファイルが正しくデプロイおよびロードされていることを確認してください。HTML ソースで URL を検索し、それらを新しいタブにコピーして、正しく読み込まれるかどうかを確認します。

また、すべての JavaScript ファイルをサーバーに置くようにしてください (「https://ajax.googleapis.com/...」の URL はありません)。クロスドメイン スクリプティングのアクセス許可で問題が発生したことがあります。

また、読み込まれているさまざまな JavaScript ライブラリと競合する可能性もあります。SharePoint コンテキスト内の jQuery の場合、通常は「noConflict」オプションを使用します。

var $j = jQuery.noConflict(); $j(document).ready(function() { .....

于 2012-11-19T13:48:58.883 に答える
-2

POST を使用する必要があり、難しい方法で見つかった GET を使用できないと言いたいだけです。

于 2014-02-13T03:07:02.223 に答える