28

AJAX 機能を公開したい WebPart (オブジェクト モデルは使用しませんが、SharePoint 環境で使用されます) を開発しています。 環境の性質上、スクリプト マネージャーをページに直接追加することは、オプションではないため、プログラムで追加する必要があります。Web パーツ コードで ScriptManager コントロールをページに追加しようとしました。

protected override void CreateChildControls()
{
    if (ScriptManager.GetCurrent(Page) == null)
    {
        ScriptManager sMgr = new ScriptManager();
        // Ensure the ScriptManager is the first control.
        Page.Form.Controls.AddAt(0, sMgr); 
    }
}

ただし、このコードを実行すると、次のエラー メッセージが表示されます。

「DataBind、Init、Load、PreRender、または Unload フェーズ中にコントロール コレクションを変更することはできません。」

ScriptManager を WebPart からページに追加する別の方法はありますか、それとも、WebPart を使用する各ページ (またはマスター ページ) に ScriptManager を追加する必要がありますか?

4

7 に答える 7

41

ページのInitイベントを使用して、これを機能させることができました。

protected override void OnInit(EventArgs e)
{
    Page.Init += delegate(object sender, EventArgs e_Init)
                 {
                     if (ScriptManager.GetCurrent(Page) == null)
                     {
                         ScriptManager sMgr = new ScriptManager();
                         Page.Form.Controls.AddAt(0, sMgr);
                     }
                 };
    base.OnInit(e);
}
于 2008-10-08T18:48:59.140 に答える
7

私は他の皆さんと同じ基本的な問題を抱えていました。私はカスタム ascx コントロールを作成していましたが、呼び出し元のページに scriptmanager が宣言されているかどうかを心配したくありませんでした。ascx contorl自体に以下を追加することで問題を回避しました。

ascxページへ -

<asp:PlaceHolder runat="server" ID="phScriptManager"></asp:PlaceHolder>

更新パネル自体で -oninit="updatePanel1_Init"

ascx.cs ファイルに -

protected void updatePanel1_Init(object sender, EventArgs e)
{
     if (ScriptManager.GetCurrent(this.Page) == null)
     {
         ScriptManager sManager = new ScriptManager();
         sManager.ID = "sManager_" + DateTime.Now.Ticks;
         phScriptManager.Controls.AddAt(0, sManager);
     }
}

私を始めてくれたこのスレッドの他のみんなに感謝します。

于 2009-11-19T05:05:40.910 に答える
6

私はこれを行いましたが、動作します。コントロールのプレースホルダーを作成します。

<asp:PlaceHolder ID="WebGridPlaceholder" runat="server" >
</asp:PlaceHolder>

次に、CreateChildControls でこれを行うことができます。

ScriptManager aSM = new ScriptManager();
aSM.ID = "GridScriptManager";
WebGridPlaceholder.Controls.Add(aSM);
于 2008-12-05T23:27:33.127 に答える
5

カスタム ascx サーバー コントロールでこの問題に遭遇しました。コントロールの OnInit イベントへのスクリプトの追加 (ScriptManager コントロールをチェックするまで実行されません)、コントロールのサーバー タグ内にロジックを追加すること、および他のほぼすべてのイベントに何かを追加することなど、多くの解決策を試しました。ダメ。最後に、ScriptManagerProxy から継承するコントロールを作成し、ktrauberman のコードをわずかに変更して使用し、必要に応じて ScriptManager を追加します。

  public class ProxiedScriptManager : ScriptManagerProxy
  {
    protected override void OnInit(EventArgs e)
    {
      //double check for script-manager, if one doesn't exist, 
      //then create one and add it to the page
      if (ScriptManager.GetCurrent(this.Page) == null)
      {
        ScriptManager sManager = new ScriptManager();
        sManager.ID = "sManager_" + DateTime.Now.Ticks;
        Controls.AddAt(0, sManager);
      }

      base.OnInit(e);
    }
  }

それは私のためにそれをしました。

于 2009-09-17T20:55:09.040 に答える
2

これは、SharePoint 2007 / 2010 互換の Web パーツで更新パネルを機能させる唯一の方法です。2010 マスター ページには scriptmanager を使用しますが、2007 マスター ページにはスクリプト マネージャーを使用しません。

.ascx

<asp:PlaceHolder ID="sMgr_place" runat="server" />
<asp:UpdatePanel runat="server" OnInit="updatePanel_Init"><ContentTemplate>
...
</ContentTemplate></asp:UpdatePanel>

.ascx.cs

public void updatePanel_Init(object sender, EventArgs e)
{
    if (ScriptManager.GetCurrent(Page) == null)
    {
        ScriptManager sMgr = new ScriptManager();
        sMgr.EnablePartialRendering = true;
        sMgr_place.Controls.Add(sMgr);
    }
}
于 2011-04-11T17:57:17.843 に答える
1

このコードは、更新パネルを含むカスタム Web コントロール (.cs) で使用しました。

protected override void OnInit(EventArgs e)
{
    //...
    if (ScriptManager.GetCurrent(this.Page) == null)
    {
        ScriptManager scriptManager = new ScriptManager();
        scriptManager.ID = "scriptManager_" + DateTime.Now.Ticks;
        Controls.AddAt(0, scriptManager);
    }
    //...
}
于 2014-02-14T18:32:28.957 に答える
0

私はこれと同様の問題を抱えており、グローバルScriptManagerをマスターページに追加してから、背後のコードで次の方法で追加するのが最善の方法であることがわかりました。

ScriptManager.GetCurrent(Page).Services.Add(new ServiceReference(virtualPath));
于 2009-03-26T02:33:44.287 に答える