2011-03-29 58 views
1

這是關於ASP.NET,ViewState,UserControls和丟失我的屬性的值。我知道,這是一個經典的問題,儘管我已經在這裏和谷歌上尋找解決這個問題的辦法,但我沒有成功。相反,我測試的東西越多,看起來就越少。ASP.NET/UserControl,ViewState和丟失屬性值

最重要的是,我使用的是ext.net及其所謂的DirectMethod,但我不認爲這與這個問題有很大關係。還有我有很多問題,我希望這個文本將是相當可讀性和可理解=)

的用戶控件

我有一個用戶控件,Customers.ascx,包含一些屬性。 「最」重要的是* _CustomerId *。該_CustomerId設置在代碼隱藏在ext.net的「DirectMethod」像這樣(從頁Customers.aspx下面的代碼):

[DirectMethod] 
    public void SetCustomer() 
    { 
     RowSelectionModel sm = GridPanel2.SelectionModel.Primary as RowSelectionModel; 

     if (sm.SelectedRow != null) 
     { 
      uint customerId = uint.Parse(sm.SelectedRow.RecordID); 
      customer_modify._CustomerId = customerId; 
     } 
    } 

的「customer_modify」是爲客戶定義的用戶控件實例的.aspx(一個頁面,而不是用戶控件):

<asp:Content ID="Content2" ContentPlaceHolderID="CPH_center" runat="server"> 
    <CP:Customer ID="customer_modify" runat="server" _IsCreateMode="false" ViewStateMode="Enabled" /> 
</asp:Content> 

在該頁面中,Customers.aspx,我有ext.net GridPanel中列出的客戶,當我點擊的GridPanel行的(直接)方法SetCustomer被執行。

正如你可以在SetCustomer - 方法看,樓市「_CustomerId」與一個UINT更新,所以讓我們來看看屬性在用戶控件:

public uint _CustomerId 
    { 
     get 
     { 
      object o = ViewState["_CustomerId"]; 
      if (o == null) 
       return 0; 
      return (uint)o; 
     } 
     set 
     { 
      object o = ViewState["_CustomerId"]; 
      ViewState["_CustomerId"] = value; 
      SetCustomer(); 
     } 
    } 

正如你所看到的,我正在使用ViewState-thingie,這是我希望的狀態,即屬性的價值將被記住。他們不是。

當我點擊GridPanel中的某一行時第一次我可以看到(通過打破)ViewState [「_ CustomerId」] == null這是否正常。之後我看到_CustomerId的setter被執行並且ViewState [「_ CustomerId」]被分配了RecordID(uint)。

我現在單擊GridPanel中的另一行,並再次執行SetCustomer方法。我在_CustomerId的setter中斷,並查看ViewState [「_ CustomerId」]在賦值之前是什麼。 它是0,但我希望它是上一行單擊的值。

爲什麼是0?我錯過了什麼?

另外:

我實際上有兩個出現在頁面上的用戶控件的,另一種名爲「customer_create」:

<ext:Window 
     ID="Window_CreateNewCustomer" 
     runat="server" 
     Icon="New" 
     Title="Skapa ny kund" 
     Hidden="true" 
     Width="480" 
     Height="370" 
     Modal="true"> 

     <Content> 
      <CP:Customer ID="customer_create" runat="server" Title="Skapa ny kund" _IsCreateMode="true" /> 
     </Content> 
</ext:Window> 

什麼擾亂了我很多的是,每​​一次我單擊GridPanel中的一行,用戶控件中的Page_Load被執行兩次,儘管我只是在SetCustomer()方法中更新其中的一個。

這是爲什麼?

任何提示,想法和幫助將不勝感激。

回答

2

ViewState被序列化,加密並作爲隱藏表單字段發送到客戶端,以便在某些事件觸發表單提交時重新創建。 A [DirectMethod]沒有通過表單提交(它是作爲AJAX調用處理的),因此它既不能讀取也不能寫入ViewState數據,除非特別要求以ViewStateMode.Enabled來請求這些數據的往返。

在任何針對表單的請求中,Load事件將從頁面中觸發,並因此被預訂階段page processing lifecycle中訂閱事件的頁面上的每個用戶控件接收 - 無論是兩個一個UserControl或兩個不同UserControl的實例,它是兩個訂戶,因此有兩個調用(每個實例一個)。

+0

感謝您的回答。這讓我以正確的方式。解決方案很簡單,只需將「ViewStateMode = Ext.Net.ViewStateMode.Enabled」添加到DirectMethod屬性中,如下所示:[DirectMethod(ViewStateMode = Ext.Net.ViewStateMode.Enabled)]。在我剛剛做的一個快速測試中,ViewState按預期保存=) – Ted 2011-03-29 22:00:30

+0

儘管我只是更新一個UserControl,但Page_Load仍然執行了兩次,你能說幾句話嗎? =) – Ted 2011-03-29 22:02:13

+0

我只是添加一個快速評論來確認,但是......默認情況下,ViewState不會在Ext.NET中的DirectMethod或DirectEvent請求中發送。正如您發現的那樣,您可以通過設置ViewStateMode = Enabled來覆蓋此功能。 – 2011-03-31 20:00:57