UserControl中的AJAX ScriptManager

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

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

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

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

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

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

     

这是一个链接:

MSDN信息

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

我没有测试过这个,但我认为它会起作用。

对我有用的是在

之后包含这一行

   

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

我做了两件有用的东西。

在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 

希望这有效。