4

我有一个 UserControl,其中包含一个包含其他控件的 UpdatePanel。UserControl 将用于一些已经有 ScriptManager 的页面和其他没有 ScriptManager 的页面。如果不存在,我希望 UserControl 自动带来自己的 ScriptManager。

我已经尝试过 ScriptManager.GetCurrent,如果它返回 null,我将创建自己的 ScriptManager 并将其插入到表单中,但我无法在 UserControl 的生命周期中找到足够早的位置来运行此代码。我不断收到错误消息“ID 为 'uPnlContentList' 的控件需要页面上的 ScriptManager。ScriptManager 必须出现在任何需要它的控件之前。” 每次我尝试加载页面。我尝试运行我的代码的地方是 OnInit、CreateChildControls 和 PageLoad,它们永远不会被调用,因为它在到达它们之前就死了。

我应该把这张支票放在哪里?

4

5 回答 5

11

在您的所有 ASPX 文件引用的 MasterPage 中放置一个 ScriptManager。然后在站点中您需要使用 ScriptManager 的任何其他地方使用 ScriptManagerProxy,它将从母版页获取 ScriptManager,并让您在用户控件和后面的代码中使用它。

现在调用 ScriptManager.GetCurrent(Page) 将为您提供对脚本管理器的引用。

<asp:ScriptManagerProxy>
  <Scripts>
    <asp:ScriptReference Path="~/Scripts/myscript.js" />
  <Scripts>
</asp:ScriptManagerProxy>

这是一个链接:

MSDN 信息

于 2009-03-16T16:21:09.077 回答
2

我讨厌从另一个方向来,但是您使用的是母版页吗?如果是这样,您是否考虑过在其上放置一个 ScriptManager 并完成它?

于 2009-03-16T15:38:49.020 回答
0

我认为 Init 事件应该起作用。使用您描述的技术(即在添加之前检查 ScriptManager.GetCurrent 返回 null)但是当您添加 ScriptManager 时,请确保将其添加为表单内的第一个控件。

我没有对此进行测试,但我认为它会起作用。

于 2009-03-16T16:32:32.433 回答
0

对我有用的是在 <form> 之后包含这一行

 <asp:ScriptManager ID="scriptManager" runat="server"/>

这让我明白了“......页面上需要一个 ScriptManager。ScriptManager 必须出现在任何需要它的控件之前。”

于 2012-05-15T15:14:25.660 回答
0

我做了两件有效的事情。

在 UserControl 上制作这个 Sub:

Public Sub SetFocus()
    txtBox.Focus()
End Sub

在 caling 站点上,在 ScriptManagerCall 之前调用它

userControl.SetFocus()

如果您在 UserControl 上有 AutoPostback,您还必须在 TextChanged 事件中设置焦点。

Protected Sub txtBox_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtBox.TextChanged
    txtBox.Focus()
    ......
End Sub

希望这有效。

于 2015-03-26T12:20:27.317 回答