我有一个名为'Inspirations'的UserControl,其中包含以下公共属性
private int pagenumber;
public int PageNumber
{
get { return pagenumber; }
set { pagenumber = value; }
}
在我的aspx页面上,我设置了属性的值,如下所示:
Inspirations.PageNumber = (int)Convert.ToInt32(this.txtNum.Text);
在我的aspx页面上,我写回来检查它的设置值:
Response.Write(Inspirations.PageNumber.ToString());
...它在我的aspx页面上。
但是,我的UserControl上有一个按钮来测试PageNumber的值,当我点击它时它总是回零。
protected void btnAddCompany_Click(object sender, EventArgs e)
{
Response.Write(PageNumber.ToString());
}
...属性值似乎没有传回给我的控件。
请有人告诉我我做错了什么。
此致 熔体
答案 0 :(得分:2)
您需要在ViewState或SessionState中保留值:
例如:
public int PageNumber
{
get
{
if (ViewState["PageNumber"] == null || ViewState["PageNumber"].ToString().Trim() == String.Empty)
{
ViewState["PageNumber"] = 0;
}
return Int32.Parse(ViewState["PageNumber"].ToString().Trim());
}
set
{
ViewState["PageNumber"] = value;
}
}
答案 1 :(得分:0)
您的按钮单击将通过回发操作,这意味着仍将调用ASP.NET页面生命周期中的其他方法(例如OnInit(),OnLoad())。
如果您在其中一个中设置PageNumber,它将在浏览器到达您的按钮点击处理程序之前删除设置的值。
在设置属性/字段值之前检查IsPostBack属性以防止这种情况。
答案 2 :(得分:0)
aspx页面中的事件/阶段序列包括以下内容(这是部分列表):
在渲染阶段,您在标记方面拥有的任何代码都会被调用。
一般情况下,除了渲染期间,调用Response.Write()
并不安全。如果在此之前调用它,任何输出都将出现在所有标记之前。
所以,你的问题的答案:首先,这一切都需要在同一个请求中发生,因为只存储一个公共属性不会在请求之间保持价值。接下来,确保在生命周期的早期设置属性(通常是OnLoad)。接下来,不要使用Response.Write()
输出结果。设置<asp:Label>
控件的值,或类似的值。