我有一个UserControl,其中包含一个UpdatePanel,它包含了一些其他控件。 UserControl将用于已有ScriptManager的一些页面和其他没有ScriptManager的页面。我希望UserControl自动带来自己的ScriptManager(如果不存在)。
我已经尝试过ScriptManager.GetCurrent,如果它返回null,我创建自己的ScriptManager并将其插入到Form中,但我无法在UserControl的生命周期中尽早找到一个位置来运行此代码。我不断收到错误“带ID的控件'uPnlContentList'需要页面上的ScriptManager。ScriptManager必须出现在任何需要它的控件之前。”每次我尝试加载页面。我尝试运行我的代码的地方是OnInit,CreateChildControls和PageLoad,它们永远不会被调用,因为它在到达它们之前就已经死了。
我应该把这张支票放在哪里?
答案 0 :(得分:11)
在MasterPage中放置一个所有ASPX文件引用的ScriptManager。然后,您需要使用ScriptManager的站点中的任何其他位置使用ScriptManagerProxy,它将从母版页获取ScriptManager,并允许您在用户控件和后面的代码中使用它。
现在调用ScriptManager.GetCurrent(Page)将为您提供对脚本管理器的引用。
<asp:ScriptManagerProxy>
<Scripts>
<asp:ScriptReference Path="~/Scripts/myscript.js" />
<Scripts>
</asp:ScriptManagerProxy>
这是一个链接:
答案 1 :(得分:2)
我讨厌从另一个方向来到这里,但你使用的是母版吗?如果是这样,您是否考虑过在其上放置一个ScriptManager并完成它?
答案 2 :(得分:0)
我认为Init事件应该有效。使用您描述的技术(即检查ScriptManager.GetCurrent在添加之前返回null),但是当您添加ScriptManager时,请确保将其添加为表单中的第一个控件。
我没有测试过这个,但我认为它会起作用。
答案 3 :(得分:0)
对我有用的是在&lt;&lt;表格&gt;
<asp:ScriptManager ID="scriptManager" runat="server"/>
让我解决了“...需要在页面上使用ScriptManager。ScriptManager必须出现在任何需要它的控件之前。”
答案 4 :(得分:0)
我做了两件有用的东西。
在UserControl上创建此Sub:
Public Sub SetFocus()
txtBox.Focus()
End Sub
在校准网站上,在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
希望这有效。