Javascript 如何在部分回发上保留脚本块?

Javascript 如何在部分回发上保留脚本块?,javascript,asp.net,updatepanel,scriptmanager,Javascript,Asp.net,Updatepanel,Scriptmanager,这是我目前正在开发的Web应用程序中面临的一个问题。 因此,我没有将问题与无关的代码混为一谈,而是在一个孤立、简化的webapp中重新创建了问题,该webapp只演示了这个问题。 希望这有助于找到解决方案 我有一个web用户控件,其内容如下: <% if (ShowAlertScript) { %> <script type="text/javascript"> function AlertMe() {

这是我目前正在开发的Web应用程序中面临的一个问题。
因此,我没有将问题与无关的代码混为一谈,而是在一个孤立、简化的webapp中重新创建了问题,该webapp只演示了这个问题。
希望这有助于找到解决方案

我有一个web用户控件,其内容如下:

<% if (ShowAlertScript)
   { %>
       <script type="text/javascript">
           function AlertMe() 
           {
               alert('Hello World!');
           }
       </script>
<% } %>
<input type="button" onclick="AlertMe()" value="Say Hello" />
当您单击
btnSwitch
时,它只需使用用户控件切换到第二个视图。 注意我如何将
showartscript
初始化为
true

潜在的输出是,由于我在用户控件中“显示警报脚本”,因此当您单击
输入按钮
元素时,
AlertMe()
函数将执行,因为它是根据内联
if
语句写出的

如果您运行我提供给您的这段代码,它将无法工作。
浏览器会说它看不到
AlertMe()
函数;据它所知,它还没有定义。 但是如果您取出
UpdatePanel
(或禁用
ScriptManager
的部分呈现),当您单击
btnSwitch
时,它在完全回发时可以正常工作

我希望它能够部分回发,因为与页面的其余部分相比,这整件事只是一小部分,我不希望每次他们切换视图时都进行完整的回发。
显然,
ScriptManager
甚至不需要为可能的更改重新呈现ascx文件。
要么是
ScriptManager
不够智能,要么是我缺少一个选项,可以让它呈现
,这样我就可以在客户端调用它的方法

有人可能会建议一个可能的答案是“为什么不取出javascript,将其放入自己的.js文件中,让页面引用它,以便控件可以使用它?”
这对我来说真的不起作用,因为脚本块会执行一些与单个控件实例相关的初始化和修改,而不是与页面上的所有其他控件实例相关

反过来,您也可能会担心,如果我有多个控件实例,那么最终会得到同一脚本的副本。不是真的;在任何给定的时间,该控件在页面中只有一种输入模式,只是我在两个单独的视图中有这两种模式,我让用户在它们之间切换

感谢您刚刚阅读到这里=)

感谢您的帮助和输入。

要使脚本块得到正确支持,您必须在用户控件的
预渲染
阶段使用以下方法注册它:

(以上假设您在
ascx
文件的指令中将
AutoEventWireup
属性设置为
true
。)


此外,由于脚本是从用户控件注册的,但您的脚本驻留在页面本身上,因此您可能必须向控件标记中添加一个元素才能使上述内容正常工作。

UpdatePanel实际上通过与UpdatePanel控件对应的div上的AJAX框架设置
innerHTML
更改了其内容

设置innerHTML时不执行脚本元素

因此,无法在部分回发期间执行内联(即声明性)JS

<asp:ScriptManager runat="server" />
<asp:UpdatePanel runat="server">
  <ContentTemplate>
    <asp:MultiView ActiveViewIndex="0" runat="server" ID="mvw">
      <asp:View runat="server">
        <asp:Button runat="server" ID="btnSwitch" 
            OnClick="btnSwitch_Click" Text="Switch" />
      </asp:View>
      <asp:View runat="server">
        <uc:MyInputControl runat="server" ID="micInput" ShowAlertScript="true" />
      </asp:View>
    </asp:MultiView>
  </ContentTemplate>
</asp:UpdatePanel>
protected void Page_PreRender(object sender, EventArgs e)
{
    if (ShowAlertScript) {
        ScriptManager.RegisterClientScriptBlock(this,
            typeof(YourUserControl), "AlertScript",
            @"function AlertMe() 
              {
                  alert('Hello World!');
              }",
            true);
    }
}