2011-06-24 57 views
1

在我的ASP.NET頁面,我有如下定義泛型類:頁面項不持久?

public partial class log_states : BasePage 
{ 
    protected class StatesUsed 
    { 
     public int StateCode { get; set; } 
     public string StateName { get; set; } 
    } 
    private List<StatesUsed> _statesUsed; 
} 

在Page_Load()事件,我初始化_statesUsed像下面,並將其綁定到一個網格:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     _statesUsed = new List<StatesUsed>(); 
     BindMyGrid(); 
    } 
} 

private void BindMyGrid() 
{ 
    gvStates.DataSource = _statesUsed; 
    gvStates.DataBind(); 
} 

然後我有一個表單來添加新的狀態。當用戶添加一個狀態時,我試圖將它添加到當地的_statesUsed變量中,並重新綁定網格。例如:

​​

這當試圖添加新項說「未將對象引用設置到對象的實例」 ......

如何保持_statesUsed持續性總是失敗?這個想法是使用泛型類添加所有用戶輸入,然後一次更新數據庫。如果你知道另一種方法來實現這一點,我會非常感激。

在此先感謝!

回答

1

而不是

private List<StatesUsed> _statesUsed; 

我通常使用類似的東西:

private List<StatesUsed> _statesUsed 
{ 
    get 
    { 
     var result = ViewState["_stateUsed"] as List<StatesUsed>; 

     if (result == null) 
     { 
      result = new List<StatesUsed>(); 
      ViewState["_stateUsed"] = result; 
     } 

     return result; 
    } 
} 

即我堅持頁面類變量爲ViewState

+2

由於視圖狀態是一個文本值,即進入它需要可序列化的一切,所以你也需要標註StatesUsed類作爲[序列化] – AndreasKnudsen

+0

謝謝,@安德烈亞斯,很好的信息! –

+1

謝謝Andreas和Uwe!這工作很好。是的,它需要在類上設置'Serializable'屬性... – Jim

1

如果您想通過多次回發來保持東西「活躍」,您必須將東西存儲到數據庫,使用Session,使用Viewstate或將其暫時存儲在共享服務器內存中。你選擇哪一個取決於你的用例,

在你的情況下,我可能會添加一個asp:HiddenField runat =「server」ID =「HiddenFieldUsedStateIDs」,其中我寫了ID逗號分隔,每當有變化然後讀取值到在Page_Load中的泛型列表(上 Page_Load中,不僅僅是!的IsPostBack)

這將利用在Asp.Net ViewState的機制,將值寫入呈現的HTML和其讀回每個帖子上的HiddenField值

-1

Asuuming,你在沒有禁用ViewState中,你可以做,

protected void btnAddMat_Click(object sender, EventArgs e) 
    {  
     List<StatesUsed> temp = null; 

     temp = (List<StatesUsed>)gvStates.DataSource; 
     if(temp != null) 
      temp.Add(new StatesUsed { StateCode = 1, StateName = "Test" });      
gvStates.DataBind();   
    } 
+0

這不起作用,因爲'gvStates.DataSource'是一個對象,所以會失敗。鑄造也無濟於事。 – Jim