2013-02-19 2 views
15

Questo è l'HTML. Ho un ripetitore che contiene un controllo utente.La proprietà del controllo utente perde valore dopo un postback

<asp:Repeater ID="rpNewHire" runat="server"> 
<HeaderTemplate> 
    <table>    
</HeaderTemplate> 
<ItemTemplate> 
    <tr> 
    <td> 
     <user:CKListByDeprtment ID = "ucCheckList" 
      DepartmentID= '<%# Eval("DepID")%>' 
      BlockTitle = '<%# Eval("DepName")%>' 
      runat = "server"></user:CKListByDeprtment> 
    </td> 
    </tr> 
    </ItemTemplate> 
    <FooterTemplate> 
    </table> 
    </FooterTemplate> 
</asp:Repeater> 

DepartmentID è una proprietà che ho definito all'interno del controllo utente.

int departmentID; 

public int DepartmentID 
{ 
    get { return departmentID; } 
    set { departmentID = value; } 
} 

Ed è così che sto cercando di accedervi

protected void Page_Load(object sender, EventArgs e) 
{ 
    int test = departmentID; 
} 

Quando la pagina viene caricata per la prima volta, IDdipartimento ha un valore. Tuttavia, quando la pagina Post torna, quel valore è sempre .

risposta

21

Tutte le variabili (e controlli) sono disposti alla fine del ciclo di vita della pagina. Quindi hai bisogno di un modo per mantenere la tua variabile, ad es. nello ViewState.

public int DepartmentID 
{ 
    get { 
     if (ViewState["departmentID"] == null) 
      return int.MinValue; 
     else 
      return (int)ViewState["departmentID"]; 
    } 
    set { ViewState["departmentID"] = value; } 
} 

Il MSDN Magazine articolo "Opzioni Nove per la gestione persistente Stato utente in un'applicazione ASP.NET" è utile, ma non è più visibile sul sito MSDN. È nell'edizione di aprile 2003, che puoi download as a Windows Help file (.chm). (Non dimenticare di richiamare le proprietà e sbloccare la cosa "questo è stato scaricato da internet", altrimenti non è possibile visualizzare gli articoli.)

+0

Ha senso. Stavo usando il departmentID variabile in tutta la classe. Cosa uso invece? La proprietà, ad esempio DepartmentID? – Richard77

+1

@ Richard77: Sì, questo è il motivo per cui preferisci le proprietà sui campi. È possibile modificare l'implementazione in un secondo momento. Rendi i campi sempre privati. –

+0

Ha senso. Non c'è da stupirsi, conoscendo il ciclo di vita della pagina ASP.NET è una delle principali domande durante il colloquio di lavoro. Grazie mille. – Richard77

3

Cambia la tua proprietà da utilizzare ViewState

int departmentID = 0; 
public int DepartmentID 
{ 
    get { 
     if(ViewState["departmentID"]!=null) 
     { departmentID = Int32.Parse(ViewState["departmentID"]); }; 
     return departmentID; 
     } 
    set { ViewState["departmentID"] = value; } 
} 
+3

Questo esploderà se 'ViewState [" departmentID "]' è nullo . Modifica: continuerà a soffiare dopo la modifica;) –