AJAX ScriptManager在用户控件中的应用

4
我有一个包含UpdatePanel用于封装其他控件的UserControl。该UserControl将用于一些已经具有ScriptManager和另一些没有ScriptManager的页面上。如果不存在ScriptManager,我希望UserControl自动引入它。
我尝试过ScriptManager.GetCurrent并检查是否返回null,如果返回null,则创建自己的ScriptManager并插入到Form中,但我找不到在UserControl的生命周期早期运行此代码的位置。每次我尝试加载页面时都会收到错误消息“ID为'uPnlContentList'的控件需要页面上的ScriptManager。ScriptManager必须出现在需要它的任何控件之前。” 我已经尝试运行代码的位置为OnInit、CreateChildControls和PageLoad,但它们从未被调用,因为程序在到达这些位置之前就已死亡了。
请问应该将此检查放在哪里?
5个回答

11

在你的MasterPage中放置ScriptManager,让所有的ASPX文件都引用它。然后在网站的其他地方,如果需要使用ScriptManager,请使用ScriptManagerProxy,它将从主页获取ScriptManager,并允许你在用户控件和代码后台中使用它。

现在调用ScriptManager.GetCurrent(Page)将会给你一个script manager的引用。

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

这里有一个链接:

MSDN Info


1
抱歉,我没有也不能有一个母版页。这是一个现有的系统,我们不允许修改所有现有页面...这就是为什么我试图将智能放在用户控件中的原因。 - cjserio
~/Scripts/myscript.js会包含什么内容? - The Light

2

我不想再从另一个角度来说,但您是否在使用主页面?如果是这样,您是否考虑将单个ScriptManager放在上面,然后就可以解决问题了吗?


不,没有主页面……别让我开始 :) 在那个决定上我的手被绑了。 - cjserio
2
为什么这是答案? - peroija

0

我已经做了两件事情,它们都有效。

在用户控件上创建这个子程序:

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

在调用网站上,在 ScriptManager 调用之前,请调用此代码。
userControl.SetFocus()

如果您的用户控件启用了AutoPostback,那么您还需要在TextChanged事件中设置焦点。
Protected Sub txtBox_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtBox.TextChanged
    txtBox.Focus()
    ......
End Sub

希望这个能够正常工作。

0

对我有效的是在<form>之后包含此行代码

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

这使我想到了"...在页面上需要一个ScriptManager。 ScriptManager必须出现在需要它的任何控件之前。"

0

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

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


抱歉,正如我所说的那样,Init事件甚至没有被触发,因为之前就已经抛出了异常... - cjserio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接