ASP.NET UpdatePanel - 内联变量

时间:2014-12-24 16:13:12

标签: asp.net webforms updatepanel

我有一个服务器端变量,在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并不是一个真正的选择。

1 个答案:

答案 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。