gpt4 book ai didi

javascript - 如何在部分回发中保留脚本 block ?

转载 作者:数据小太阳 更新时间:2023-10-29 04:39:24 24 4
gpt4 key购买 nike

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

我有一个网络用户控件,它的内容就是这个:

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

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

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

<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 时,它只是通过用户控件切换到第二个 View 。注意我是如何得到 ShowAlertScript 的已经初始化为 true .
潜在的输出是因为我在用户控件中“显示警报脚本”,AlertMe()单击 input-button 时将执行函数元素,因为它是根据内联if写出来的声明。

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

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

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

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

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

最佳答案

为了您的脚本 block 正确支持 partial page rendering ,您必须在 PreRender 期间注册它用户控制阶段,使用 ScriptManager.RegisterClientScriptBlock()方法:

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

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

此外,由于脚本是从用户控件注册的,但您的 ScriptManager驻留在页面本身,您可能必须添加 <asp:ScriptManagerProxy> 将元素添加到您的控件标记中,以使上述工作正常。

关于javascript - 如何在部分回发中保留脚本 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4231411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com