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

时间:2012-03-22 11:34:45

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

平台: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>

2 个答案:

答案 0 :(得分:2)

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

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 =&#34; server&#34;

的表单中

答案 1 :(得分:1)

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