這是關於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()方法中更新其中的一個。
這是爲什麼?
任何提示,想法和幫助將不勝感激。
感謝您的回答。這讓我以正確的方式。解決方案很簡單,只需將「ViewStateMode = Ext.Net.ViewStateMode.Enabled」添加到DirectMethod屬性中,如下所示:[DirectMethod(ViewStateMode = Ext.Net.ViewStateMode.Enabled)]。在我剛剛做的一個快速測試中,ViewState按預期保存=) – Ted 2011-03-29 22:00:30
儘管我只是更新一個UserControl,但Page_Load仍然執行了兩次,你能說幾句話嗎? =) – Ted 2011-03-29 22:02:13
我只是添加一個快速評論來確認,但是......默認情況下,ViewState不會在Ext.NET中的DirectMethod或DirectEvent請求中發送。正如您發現的那樣,您可以通過設置ViewStateMode = Enabled來覆蓋此功能。 – 2011-03-31 20:00:57