代码之家  ›  专栏  ›  技术社区  ›  Kyle Trauberman pestades

是否以编程方式将ScriptManager添加到页面?

  •  28
  • Kyle Trauberman pestades  · 技术社区  · 16 年前

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

    但是,当执行此代码时,我会收到以下错误消息:

    是否有其他方法可以将ScriptManager从Web部件添加到页面中,或者我只需将ScriptManager添加到将使用Web部件的每个页面(或母版页)中?

    7 回复  |  直到 13 年前
        1
  •  41
  •   Kyle Trauberman pestades    16 年前

    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);
    }
    
        2
  •  7
  •   Jon    15 年前

    我和你们其他人有同样的基本问题。我正在创建一个自定义ascx控件,希望能够不必担心调用页面是否声明了scriptmanager。我通过向ascx控件本身添加以下内容来解决这些问题。

    转到ascx页面-

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

    在更新面板本身中- oninit="updatePanel1_Init"

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

    感谢这篇文章中的其他人,他们让我开始了。

        3
  •  6
  •   daduffer    16 年前

    我已经做过了,而且很有效。为控件创建占位符:

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

    然后可以在CreateChildControls中执行此操作:

    ScriptManager aSM = new ScriptManager();
    aSM.ID = "GridScriptManager";
    WebGridPlaceholder.Controls.Add(aSM);
    
        4
  •  5
  •   Josh    15 年前

    我在使用自定义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
  •  2
  •   Paul    13 年前

    .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);
        }
    }
    
        6
  •  1
  •   user3311381    10 年前

    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);
        }
        //...
    }
    
        7
  •  0
  •   dkarzon Sven Grosen    15 年前

    我遇到了类似的问题,发现最好的方法是向母版页添加一个全局脚本管理器,然后在代码中添加到母版页,方法是:

    ScriptManager.GetCurrent(Page).Services.Add(new ServiceReference(virtualPath));
    
    推荐文章