【问题标题】:ScriptManager not found by UpdatePanel if loaded in BasePage如果在 BasePage 中加载,UpdatePanel 找不到 ScriptManager
【发布时间】:2012-03-22 11:34:44
【问题描述】:

平台:asp.net 4.0

我从一个基类加载脚本管理器,用于自定义 cdn 处理和在页面中插入脚本和其他自定义内容。

问题是当我插入一个 UpdatePanel 时它没有找到脚本管理器,因为 updatepanel 搜索它很早。

是否有不意味着从 basePage 中删除 ScriptManager 的解决方案。

这个类来自我们的自定义实用程序 dll

public abstract class OurFrameworkBasePage:Page
{
    protected override void OnInit(EventArgs e)
    {
        CurrentScriptManager = BuildScriptManager();
        Form.Controls.AddAt(0, CurrentScriptManager);
        base.OnInit(e);
    }

    private ScriptManager BuildScriptManager()
    {
        return new ScriptManager
        {
            //some scriptmanager settings
        };
    }

    protected ScriptManager CurrentScriptManager { get; set; }
}

这是特定于站点的基本页面

public abstract class SiteBasePage:OurFrameworkBasePage
{
    //some custom methods and utility for a specific site
}

default.aspx 页面

<html>
<head runat="server"><title></title></head>
<body>
    <form id="form1" runat="server">
       <div>
        <asp:UpdatePanel runat="server">
            <ContentTemplate>
                <asp:Literal runat="server" ID="ltr"></asp:Literal>
                <asp:Button runat="server" OnClick="btnOkClick" ID="btnOk" Text="ok"/>
            </ContentTemplate>
        </asp:UpdatePanel>
       </div>
    </form>
</body>
</html>

【问题讨论】:

    标签: c# asp.net asp.net-ajax updatepanel scriptmanager


    【解决方案1】:

    希望您可以控制您的框架类,因为这将解决您的问题:

    protected override ControlCollection CreateControlCollection()
    {
        CurrentScriptManager = BuildScriptManager();
        ControlCollection pageControls = base.CreateControlCollection();
        pageControls.AddAt(0, CurrentScriptManager);
        return pageControls;
    }
    protected override void OnInit(EventArgs e)
    {
        Form.Controls.AddAt(0, CurrentScriptManager);
        base.OnInit(e);
    }
    

    需要在这两个地方。首先,在 CreateControlCollection 中,以便它与所有其他控件一起创建。其次,在 OnInit 中,因为 ScriptManager 需要驻留在带有 runat="server"

    的表单中

    【讨论】:

    • 太棒了!我没有考虑 CreateControlCollection。同时我找到了另一个解决方案,我将其发布以供参考
    【解决方案2】:

    GuthMD 的解决方案很棒。

    与此同时,我找到了另一种满足不同需求的解决方案,我写在那里以供参考。

    我的解决方案是,如果您想使用 updatePanel 处理回发,您必须将 scriptmanager 标签放在 aspx 页面中,否则将以编程方式插入 scriptmanger 以供脚本引用

        protected override void OnInit(EventArgs e)
        {
            CurrentScriptManager = BuildScriptManager();
            base.OnInit(e);
        }
    
        private ScriptManager BuildScriptManager()
        {
            ScriptManager rtn;
            var script = Items[typeof (ScriptManager)];
            if (script == null)
            {
                rtn = new ScriptManager
                          {
                              EnablePartialRendering = false
                          };
                Form.Controls.AddAt(0, rtn);
            }
            else
            {
                rtn = (ScriptManager) script;
            }
    
            rtn.EnablePageMethods = false;
            rtn.AjaxFrameworkMode = AjaxFrameworkMode.Disabled;
            rtn.EnableCdn = true;
            return rtn;
        }
    

    【讨论】:

      猜你喜欢
      • 2013-10-07
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      • 2022-06-27
      • 1970-01-01
      相关资源
      最近更新 更多