0

我有一个独特的问题。我正在开发一个.net 解决方案,我无法访问主要的 aspx 页面。主要是,我不能修改它们中的任何一个。我正在构建一大堆用户控件,它们将用于各种 .aspx 页面。我想使用更新面板,并且知道它需要脚本管理器控件位于页面上。

所以 - 我可以访问的是 .aspx 页面上的占位符。我想要尝试做的是将脚本管理器控件放在这个占位符中。我已经知道如何做到这一点,方法是获取对上下文页面的引用,然后在其中添加一个控件。但是,我遇到了时间问题。我在 .ascx 控件上有更新面板,并且在控件的 Page_PreLoad 事件中加载了脚本管理器。这似乎不起作用,因为它抱怨“'ID 为 'updUsers' 的控件需要页面上的 ScriptManager。ScriptManager 必须出现在任何需要它的控件之前。” 很明显,更新面板是在 Page_Preload 事件之前加载的。

问题是,我到底可以使用什么方法来加载控件?这完全可以做到吗?有一个更好的方法吗?

编辑:

我已经尝试了几乎所有的事件:

protected void Page_PreInit(object sender, EventArgs e)
protected override void OnInit(EventArgs e)

细节

澄清一下,这是用户控件代码的样子:

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)
        {

        }
    }

一些工作编辑

我能够通过附加到更新面板初始化来使其部分工作,所以我知道我添加脚本管理器的方式是有效的,所以我想我只是错过了要附加到的正确页面事件。

4

1 回答 1

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>
于 2013-08-23T20:09:14.437 回答