这是我目前正在开发的网络应用程序中遇到的问题。
因此,我没有用不相关的代码来混淆问题,而是在一个孤立的、简化的 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 文件中,然后让页面引用它,以便控件可以使用它?”
这对我来说实际上不起作用,因为脚本块会执行一些与该单个控件实例相关的初始化和修改,而不是与页面上的所有其他控件实例相关。
反过来,您可能还会担心,如果我有多个控件实例,我最终会得到同一脚本的副本。并不真地;只会有一个输入模式在任何给定时间在页面中使用此控件,只是我在两个单独的视图中拥有这两种模式,并且让用户在它们之间切换。
感谢您阅读到这里=)
感谢任何帮助和意见。