2013-02-19 69 views
15

这是HTML。我有一个包含用户控件的中继器。用户控件的属性在回发后丢失值

<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的是,我的用户控制内定义的一个属性。

int departmentID; 

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

而且这是我正在试图访问它

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

页面加载后的第一次,DepartmentID的有一个值。但是,当页面回帖时,该值始终为。

回答

21

所有变量(和控制)设置在页面的生命周期结束。所以你需要一种方法来保存你的变量,例如在ViewState

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

MSDN杂志文章“九选项在ASP.NET应用程序管理永久性用户状态”是有用的,但它不再是MSDN网站上查看。它在2003年4月版,您可以download as a Windows Help file (.chm)。 (不要忘记调出属性并解除阻止“这是从互联网上下载”的东西,否则你将无法查看文章。)

+0

是有道理的。我在全班使用变量departmentID。我用什么来代替?该属性即DepartmentID? – Richard77 2013-02-19 14:48:18

+1

@ Richard77:是的,这就是为什么你应该偏好属性而不是字段。您可以稍后更改实施。使字段始终保密。 – 2013-02-19 14:49:31

+0

合理。难怪,了解ASP.NET页面的生命周期是面试过程中的首要问题之一。非常感谢。 – Richard77 2013-02-19 16:44:37

3

更改您的财产使用ViewState的

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

如果'ViewState [“departmentID”]'null 。编辑:编辑后它仍然会吹;) – 2013-02-19 14:46:55