ScriptManager не найден UpdatePanel, если загружен в BasePage - PullRequest
1 голос
/ 22 марта 2012

Платформа: asp.net 4.0

Я загружаю scriptmanager из базового класса для пользовательской обработки cdn и вставки скриптов в страницы и другие пользовательские вещи.

Проблема в том, что когда я вставляю UpdatePanel, он не находит менеджер скриптов, потому что updatepanel ищет его раньше.

Существует ли решение, которое не подразумевает удаление 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 ]

2 голосов
/ 23 марта 2012

Надеюсь, у вас есть контроль над классом фреймворка, так как это решит вашу проблему:

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"

1 голос
/ 23 марта 2012

Решение GuthMD - отличное решение.

Тем временем я нашел другое решение, отвечающее различным потребностям, и напишу для справки.

Мое решение подразумевает, что если вы хотите обрабатывать обратную передачус updatePanel вы должны поместить тег scriptmanager на страницу aspx, иначе скриптmanger будет вставлен программно для ссылок на скрипты

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