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

2024-02-25

这是我目前正在开发的网络应用程序中遇到的问题。
因此,我没有用不相关的代码来混淆问题,而是在一个孤立的、简化的 Web 应用程序中重新创建了该问题,该应用程序仅演示了此问题。
希望这有助于找到解决方案。

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

<% if (ShowAlertScript)
   { %>
       <script type="text/javascript">
           function AlertMe() 
           {
               alert('Hello World!');
           }
       </script>
<% } %>
<input type="button" onclick="AlertMe()" value="Say Hello" />

它的代码隐藏只不过是布尔定义ShowAlertScript.
这代表了我在大型网络应用程序中拥有的一个控件,它有两种模式:输入模式, and 显示模式。当在输入模式,它有一个很大的 javascript 块,只有在那时才有用;它做了一些很酷的事情来帮助用户输入信息。

该控件在大图中的布局方式如下:

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

当您点击btnSwitch,它只需使用用户控件切换到第二个视图。 请注意我如何拥有ShowAlertScript已经初始化为true.
潜在的输出是,由于我在用户控件中“显示警报脚本”,AlertMe()当您单击时,函数将执行input-button元素,因为它是根据内联写出来的if陈述。

如果您按原样运行我给您的这段代码,它将无法工作。
浏览器会说看不到AlertMe()功能;据它所知,它是未定义的。 但如果你取出UpdatePanel(或禁用ScriptManager的部分渲染),当您单击时,它将在完整回发中正常工作btnSwitch.

我希望它能够在部分回发上工作,因为与页面的其余部分相比,这整个事情只是一小部分,而且我不想每次切换视图时都进行完整的回发。
显然,ScriptManager甚至不需要重新渲染 ascx 文件以进行可能的更改。
要么是ScriptManager不够智能,或者我缺少一个选项来让它渲染<script>所以我可以在客户端调用它的方法。

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

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

感谢您阅读到这里=)
感谢任何帮助和意见。


让您的脚本块正确支持部分页面渲染 http://msdn.microsoft.com/en-us/library/bb386573.aspx,您必须在期间注册PreRender用户控制阶段,使用ScriptManager.RegisterClientScriptBlock() http://msdn.microsoft.com/en-us/library/bb350750.aspx method:

protected void Page_PreRender(object sender, EventArgs e)
{
    if (ShowAlertScript) {
        ScriptManager.RegisterClientScriptBlock(this,
            typeof(YourUserControl), "AlertScript",
            @"function AlertMe() 
              {
                  alert('Hello World!');
              }",
            true);
    }
}

(以上假设您有AutoEventWireup属性设置为true in the @ 控制 http://msdn.microsoft.com/en-us/library/d19c0t4b.aspx你的指令ascx file.)

另外,由于脚本是从用户控件注册的,但您的脚本管理器 http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.aspx驻留在页面本身上,您可能需要添加一个<asp:ScriptManagerProxy> http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanagerproxy.aspx元素到您的控制标记以使上述工作正常进行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在部分回发时保留脚本块? 的相关文章

随机推荐

  • 如何将自定义类保存/序列化到设置文件?

    我有一个小类 包含两个字符串 如下所示 public class ReportType private string displayName public string DisplayName get return displayName
  • 如何组合目标文件(.o)来创建iOS静态库(.a)?

    我已经编译了一个库并且有目标文件 o 现在我想使用 ar 将它们组合到静态库中 我可以做到这一点 但是当我在 iOS 项目中添加该文件时 它说该库是存档类型 而链接架构是arm7 我该如何解决这个问题 Solved ar crs libst
  • 在 Eclipse 中以编程方式调整视图大小

    我正在测试一个non e4使用 SWTBot 的 RCP 应用程序 我需要更改视图的大小 移动窗框 我尝试失败 使用 SWTBot 调整我的视图大小 没有这样的 api 使用 Eclipse 3 API 调整我的视图大小 不支持 使用底层
  • Mongomapper 数组的多对多问题

    我想从用户的任务列表中列出用户的所有任务名称 但是当我使用下面的代码时 我收到以下消息 undefined method task id for 这是我的课程 class User include MongoMapper Document
  • 共享表 - 排除未作为 UIActivityType 中的类型属性提供的选项

    我想排除Add to iCloud Drive Add to Reading List Save to Files Print来自共享表 我可以使用以下代码排除 添加到阅读列表 和 打印 选项 因为这些类型属性 https develope
  • 如何实现论坛权限

    我已经开始在 MVC 框架上用 PHP 开发论坛应用程序 并且已经到了向成员分配权限的阶段 例如 读取 写入 更新 删除 现在 我知道我可以在数据库的用户表下添加 5 列并将它们设置为 1 0 但如果我想添加其他规则 例如 MOVE 这对我
  • 如何使 tkinter 窗口在 i3 windowmanager 中浮动

    我只是在 python 中玩了一下 tkinter 但是我的 i3 平铺 窗口管理器遇到了一些 麻烦 我想创建一个浮动窗口来输入值 类似于 打开文件 对话框 这一定是可能的 因为 Gimp 也可以在 i3 中使用浮动窗口 当然 我不确定 t
  • Java 中的内联比较器与自定义比较器

    对列表进行排序时 使用内联 java Comparator 带有匿名内部类 与实现单独的自定义 Comparator 类之间是否存在性能差异 1 public class SortByErrorComparator implements C
  • 如何在同一浏览器实例中运行多个测试方法而不关闭它(C#、Selenium WebDriver NUnit)?

    我是 c 和 Selenium 的初学者 我想知道是否可以在同一浏览器实例中运行多个 TestMethod s 而无需关闭它 例如 Can Change Name And Title 完成后 我想继续 Can Change Profile
  • 如何从命令行将每两行合并为一行?

    我有一个具有以下格式的文本文件 第一行是 KEY 第二行是 VALUE KEY 4048 1736 string 3 KEY 0 1772 string 1 KEY 4192 1349 string 1 KEY 7329 2407 stri
  • 调整画布图像大小

    我正在尝试上传图像并将它们放入不同大小的盒子中 为了让您了解该应用程序的功能 人们上传图像并将它们打印到海报上 例如 我们的海报尺寸为 8 x 10 活动区域 完整尺寸为 9 5 x 11 5 由于最小 DPI 为 100 我们通常将 8x
  • MTKView - 调整纹理大小以填充视图

    我对 Metal 很陌生 但正在努力遵循 Apple 的规定AVCam滤镜 https developer apple com documentation avfoundation cameras and media capture avc
  • React Native:如何正确输入嵌套导航器?

    情况 正如您可能知道的那样 我目前正在构建一个有声读物播放器 多么有创意 这是我第一个针对反应原生和打字稿的更大项目 在正确输入导航方面我有点挣扎 首先 这是一个快速概述 疑问 问题 感觉我使用了太多嵌套导航器 但由于我没有任何经验 所以很
  • Eclipse 无法运行,JVM 终止退出代码-13 [重复]

    这个问题在这里已经有答案了 大家好 无法运行 Eclipse JVM 终止 退出代码 13 我有一个问题 如图所示 当我在我的电脑中打开 Ecllipse 时出现 任何人遇到这个问题并有解决方案吗 请帮助我 提前致谢 看看这里 无法运行 E
  • Firebase 身份验证 Web:如何验证电子邮件地址

    我是 Firebase 网络身份验证新手 我设法使注册表单正常工作 但在发送电子邮件以验证用户的电子邮件地址时遇到问题 用户已正常创建并显示在我的控制台中 但未发送验证电子邮件 并且 我在 Chrome 中收到以下错误 未捕获的类型错误 无
  • 如何使用 pysftp 将字符串写入 ftp 文件?

    我有一个大的 xml 文件存储在变量中 我想使用 pysftp 将其直接写入 ftp 我相信我需要使用 pysftp putfo 这需要一个类似文件的对象 这是一个最小的例子 from io import StringIO from pys
  • Azure Functions - 使用 appsettings.json

    是否可以在 Azure Functions 中使用 appsettings json 文件 这里有环境变量的文档 https learn microsoft com en us azure azure functions functions
  • DOMDocument 简单的 GetElementsByTagName 不起作用?

    xml
  • Pandas groupby 和 qcut

    有没有一种方法可以构造 Pandas groupby 和 qcut 命令以返回具有嵌套图块的一列 具体来说 假设我有 2 组数据 并且我希望将 qcut 应用于每组 然后将输出返回到一列 这类似于允许 Partition by 的 MS S
  • 如何在部分回发时保留脚本块?

    这是我目前正在开发的网络应用程序中遇到的问题 因此 我没有用不相关的代码来混淆问题 而是在一个孤立的 简化的 Web 应用程序中重新创建了该问题 该应用程序仅演示了此问题 希望这有助于找到解决方案 我有一个网络用户控件 其内容如下