2014-12-24 32 views
0

我有一個服務器端變量,它在PreRender中被分配了一個值。爲了簡單起見,假設我這樣做:ASP.NET UpdatePanel - 內聯變量

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的原始值都會保留。

有人可以解釋爲什麼這樣,並提供解決方案?例如,我相當肯定我可以通過將「測試」的值放在隱藏字段中來實現所需的行爲,但理想情況下我不必沉到這些深度。不幸的是用更輕的東西替換UpdatePanel並不是真正的選擇。

回答

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> 

以我代碼隱藏,我分配JS變量在Sys.Application.add_init方法的值,像這樣:

protected void Page_PreRender(object sender, EventArgs e) 
    { 
     ScriptManager.RegisterStartupScript(this, typeof(UpdatePanelTest), "startupScripts", "Sys.Application.add_init(function() {test='" + Guid.NewGuid().ToString() + "';});", true); 
    } 

瞧,第一次加載和每次回傳時會顯示不同的Guid。