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

我尝试了ScriptManager.GetCurrent,如果返回null,则创建我自己的ScriptManager并将其插入到Form中,但是我在UserControl的生命周期中找不到足够的位置来运行此代码。我不断收到错误消息:“ ID为'uPnlContentList'的控件在页面上需要一个ScriptManager。该ScriptManager必须出现在需要它的任何控件之前。”每次我尝试加载页面时。我尝试运行代码的位置是OnInit,CreateChildControls和PageLoad,它们从未被调用,因为它们在到达它们之前就死了。

我应该在哪里放置此检查?

#1 楼

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

评论


不,没有主页。...不要让我开始:)我的双手被那个决定所束缚。

– cjserio
09年3月16日在15:39

为什么这是答案?

–peroija
2014年10月3日,12:36

#2 楼

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

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

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


这里是一个链接:

MSDN Info

评论


抱歉,我没有主页。这是一个现有的系统,我们不允许浏览和更改所有现有的页面...这就是为什么我试图将smarts放在usercontrol中。

– cjserio
09年3月16日在17:30

〜/ Scripts / myscript.js包含什么?

–光
2011年10月11日15:37

#3 楼

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

我还没有测试这,但我认为它将起作用。

评论


抱歉,正如我所说,Init事件甚至没有被击中,因为较早抛出了异常...

– cjserio
09年3月16日在17:29

#4 楼

对我有用的是在


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


之后添加此行,这使我绕过“ ...需要页面上的ScriptManager。ScriptManager必须出现在任何需要它的控件。“

#5 楼

我做了两件事。

在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


希望这项工作有效。