Asp.Net:在UserControl中设置属性值的问题

时间:2009-12-18 09:27:30

标签: asp.net user-controls

我有一个名为'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());
}

...属性值似乎没有传回给我的控件。

请有人告诉我我做错了什么。

此致 熔体

3 个答案:

答案 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页面中的事件/阶段序列包括以下内容(这是部分列表):

  1. OnInit(先控制,然后再控制页面)
  2. OnLoad(首页,然后是控件)
  3. 控制事件(例如按下按钮)
  4. 的PreRender
  5. 渲染
  6. 在渲染阶段,您在标记方面拥有的任何代码都会被调用。

    一般情况下,除了渲染期间,调用Response.Write()并不安全。如果在此之前调用它,任何输出都将出现在所有标记之前。

    所以,你的问题的答案:首先,这一切都需要在同一个请求中发生,因为只存储一个公共属性不会在请求之间保持价值。接下来,确保在生命周期的早期设置属性(通常是OnLoad)。接下来,不要使用Response.Write()输出结果。设置<asp:Label>控件的值,或类似的值。