我有一个服务器端变量,在PreRender中赋值。为了简单起见,让我们想象我这样做:
protected string test;
protected void Page_PreRender(object sender, EventArgs e)
{
test = Guid.NewGuid().ToString();
}
在我的标记中,变量随后在UpdatePanel中引用,如下所示:
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Button ID="Button1" runat="server" Text="Perform postback" />
<script type="text/javascript">
Sys.Application.add_load(function () {
alert('<%=test%>');
});
</script>
</ContentTemplate>
</asp:UpdatePanel>
首次加载页面时,JavaScript警报功能会按预期为我提供一个随机值。但是,在任何后续回发中,将保留Guid的原始值。
有人可以解释为什么会这样,并提供解决方案吗?我非常确定我可以通过设置&#39; test&#39;的值来实现所需的行为。例如,在一个隐藏的领域,但理想情况下,我不会沉到那些深处。不幸的是,用更轻的东西替换UpdatePanel并不是一个真正的选择。
答案 0 :(得分:1)
我已经找到了解决方案,也没有像我担心的那样肮脏。我在函数之外声明了一个JS变量:
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Button ID="Button1" runat="server" Text="Perform postback" />
<script type="text/javascript">
var test;
Sys.Application.add_load(function () {
alert(test);
});
</script>
</ContentTemplate>
</asp:UpdatePanel>
在我的代码隐藏中,我在Sys.Application.add_init方法中为JS变量赋值,如下所示:
protected void Page_PreRender(object sender, EventArgs e)
{
ScriptManager.RegisterStartupScript(this, typeof(UpdatePanelTest), "startupScripts", "Sys.Application.add_init(function() {test='" + Guid.NewGuid().ToString() + "';});", true);
}
Voilà,然后在第一次加载和每次回发时显示不同的Guid。