Bee*_*Guy 7 javascript asp.net updatepanel scriptmanager
这是我正在处理的webapp中遇到的一个问题.
因此,我没有用不相关的代码混淆问题,而是在一个孤立的,简化的webapp中重新创建了问题,只展示了这个问题.
希望这有助于找到解决方案.
我有一个Web用户控件,其内容如下:
<% if (ShowAlertScript)
{ %>
<script type="text/javascript">
function AlertMe()
{
alert('Hello World!');
}
</script>
<% } %>
<input type="button" onclick="AlertMe()" value="Say Hello" />
Run Code Online (Sandbox Code Playgroud)
它的代码隐藏只不过是布尔定义ShowAlertScript.
这表示我在大型webapp中具有的控件有两种模式:输入模式和显示模式.在输入模式下,它有一个大的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>
Run Code Online (Sandbox Code Playgroud)
单击时btnSwitch,它只需使用用户控件切换到第二个视图.请注意我ShowAlertScript已经初始化了true.
可能的输出是,因为我在用户控件中"显示警报脚本",所以AlertMe()当您单击input-button元素时,该函数将执行,因为它是根据内联if语句写出的.
如果你运行这个代码我给你的目标,它将无法正常工作.
浏览器会说它看不到AlertMe()功能; 据它所知,它是未定义的.但是如果你取出UpdatePanel(或禁用ScriptManager部分渲染),当你点击它时,它将在完整的回发中正常工作btnSwitch.
我希望它能用于部分回发,因为与页面的其他部分相比,这一切都是一小部分,我不希望每次切换视图时都进行完整的回发.
显然,ScriptManager甚至没有费心重新渲染ascx文件以进行可能的更改.
要么ScriptManager是不够智能,要么我缺少一个让它渲染的选项,<script>所以我可以在客户端调用它的方法.
有人可能建议的一个潜在答案是"你为什么不拿出javascript,把它放在自己的.js文件中,并让页面引用它以便控件可以使用它?"
这对我来说无法真正起作用,因为脚本块会对该单个控件实例进行一些初始化和修改,而不是对页面上的所有其他实例进行初始化和修改.
反过来,您可能还担心如果我有多个控件实例,我最终会得到相同脚本的副本.并不是的; 在任何给定的时间,页面中只有一个这种控件的输入模式,只是我在两个单独的视图中有这两种模式,我让用户在它们之间切换.
感谢您只需阅读此内容=)
感谢任何帮助和输入.
要使脚本块正确支持部分页面呈现,您必须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);
}
}
Run Code Online (Sandbox Code Playgroud)
(以上假设您在文件的@ Control指令中AutoEventWireup设置了属性.)trueascx
此外,由于脚本是从用户控件注册的,但您的ScriptManager驻留在页面本身上,因此您可能必须<asp:ScriptManagerProxy>在控件标记中添加一个元素才能使上述工作正常.
| 归档时间: |
|
| 查看次数: |
2366 次 |
| 最近记录: |