UserControl中的AJAX ScriptManager

时间:2009-03-16 15:34:43

标签: c# ajax user-controls scriptmanager

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

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

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

5 个答案:

答案 0 :(得分:11)

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

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

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

这是一个链接:

MSDN Info

答案 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

希望这有效。