我有一个独特的问题。我正在开发.net解决方案,我无法访问主aspx页面。主要是,我不能修改它们中的任何一个。我正在构建一大堆用户控件,这些用户控件将在各种.aspx页面上使用。我想使用updatepanel,并且知道它需要scriptmanager控件在页面上。
所以 - 我有权访问的是.aspx页面上的占位符。我想要尝试做的是将scriptmanager控件放在这个占位符中。我已经知道如何执行此操作,方法是获取对上下文页面的引用,然后在其中添加控件。但是,我的时机问题。我在.ascx控件上有updatepanel,并且我在控件的Page_PreLoad事件中加载了scriptmanager。这似乎不起作用,因为它抱怨“'具有ID'updUsers'的控件需要页面上的ScriptManager。ScriptManager必须出现在任何需要它的控件之前。”很明显,updatepanel是在Page_Preload事件之前加载的。
问题是,我可以使用什么方法来加载控件?这可以完成吗?有更好的方法吗?
修改
我几乎尝试了所有活动:
protected void Page_PreInit(object sender, EventArgs e)
protected override void OnInit(EventArgs e)
详情
为了澄清,这就是usercontrol代码的样子:
public partial class PollModule : ModuleBase
{
protected override void OnInit(EventArgs e)
{
Page page = HttpContext.Current.Handler as Page;
page.Init += delegate(object sender, EventArgs e_Init)
{
if (ScriptManager.GetCurrent(page) == null)
{
ScriptManager sMgr = new ScriptManager();
page.Form.Controls.AddAt(0, sMgr);
}
};
base.OnInit(e);
}
protected void Page_Load(object sender, EventArgs e)
{
}
}
SOMEWHAT正在编辑
我能够通过附加到updatepanel init来使其部分工作,所以我知道我添加scriptmanager的方式是有效的,所以我想我只是错过了要附加到的右页事件。
答案 0 :(得分:0)
如果在UserControl中使用ScriptManager很简单 - 您可以使用ScriptManagerProxy。
这样所有的AJAX控件都可以编译运行,并且不会与主页的ScriptManager冲突
只需在控制标记中声明它,例如
<%@ Control Language="CSharp" AutoEventWireup="false" CodeFile="MyControl.cs" Inherits="MyControl" %>
<asp:ScriptManagerProxy ID="ScriptManagerProxy1" runat="server">
<Services>
</Services>
<Scripts>
</Scripts>
</asp:ScriptManagerProxy>