web-dev-qa-db-ja.com

プログラムでページにScriptManagerを追加しますか?

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

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を追加する必要がありますか?

28
Kyle Trauberman

ページの初期化イベントを使用してこれを機能させることができました:

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);
}
41
Kyle Trauberman

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

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

次に、これをCreateChildControlsで実行できます。

ScriptManager aSM = new ScriptManager();
aSM.ID = "GridScriptManager";
WebGridPlaceholder.Controls.Add(aSM);
6
daduffer

カスタム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);
    }
  }

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

5
Josh

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

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);
     }
}

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

5
Jon

これが、アップデートパネルをSharePoint 2007/2010互換のWebパーツで機能させる唯一の方法です。 2010マスターページはスクリプトマネージャーを使用していますが、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);
    }
}
2
Paul

このコードは、更新パネルを含むカスタム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);
    }
    //...
}
1
user3311381

私はこのような問題を抱えていて、最善の方法はグローバルScriptManagerをマスターページに追加することであり、背後のコードで次のように追加できます。

ScriptManager.GetCurrent(Page).Services.Add(new ServiceReference(virtualPath));
0
dkarzon