2012-03-22 3 views
1

Платформа: ASP.NET 4.0ScriptManager не найден UpdatePanel, если загружена в BasePage

загружает ScriptManager из BaseClass для пользовательской обработки ТПСА и скриптов вставки в страницах и других пользовательских вещах.

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

Есть ли решение, которое не подразумевает удаление ScriptManager из basePage.

этот класс из нашего пользовательской утилиты 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; } 
} 

это сайт конкретного BasePage

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

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

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"

+0

Отлично! Я не думал о CreateControlCollection. в то же время я нашел другое решение, и я отправлю его для справки – giammin

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; 
    } 
Смежные вопросы