如果在BasePage中加载,UpdatePanel找不到ScriptManager

本文关键字:UpdatePanel 找不到 ScriptManager 加载 BasePage 如果 | 更新日期: 2023-09-27 18:28:43

平台:asp.net 4.0

我从基类加载scriptmanager,用于自定义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>

如果在BasePage中加载,UpdatePanel找不到ScriptManager

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

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"的表单中

GuthMD的解决方案非常棒。

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

我的解决方案意味着,如果你想用updatePanel处理回发,你必须在aspx页面中放置scriptmanager标记,否则scriptmanager将以编程方式插入脚本引用

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