ASP.NET控件生命周期。控件属性更改仅在下次加载时可用

时间:2013-02-14 16:29:23

标签: asp.net

我已经构建了一个具有各种属性的寻呼机控件,例如Start,以指示应该呈现的第一条记录。这嵌入在另一个实际呈现记录列表的控件中。物业' getter和setter使用ViewState来持久化并检索值。

寻呼机中的链接是在page_load期间动态创建的。在每个链接上,anchor.ServerClick委托连接到lambda,该lambda在寻呼机控件上设置Start属性。

当我调试页面时,我可以看到Start属性确实已更新,但更改后的值仅在下次加载页面时可用,可能是通过ViewState机制保留的。

这在实践中意味着嵌入控件没有及时查看这些属性的更新值以呈现正确的列表。如何让访问者点击更新寻呼机属性,然后再使用它们?

编辑:添加一些代码

从主控件的Page_Load调用,我有一个引用寻呼机属性的循环。此循环确定将显示的项目,如果此时更新了控件属性,它将显示正确的记录,但情况并非如此。

for (int i = pager.Start - 1 ; 
          i < queryResults.Count() && i <= (pager.Start + pager.PageSize); i++) {

在寻呼机控件中,也是从Page_Load中调用的,这样的代码就是添加子控件并连接代理。

HtmlAnchor a = new HtmlAnchor();
a.HRef = "#";
a.InnerText = page.ToString();
newStartNumber = ((page - 1) * this.PageSize) + 1;
a.Attributes["data-start"] = newStartNumber.ToString();
a.ServerClick += (sender, e) => 
      { this.Start = int.Parse(((HtmlAnchor)sender).Attributes["data-start"]); };
li.Controls.Add(a);
ul.Controls.Add(li);

因此,当点击这些锚点时,会更新寻呼机的“开始”属性,但为时已晚。

1 个答案:

答案 0 :(得分:0)

据我所知,这些代码部分似乎没问题,提供:

您的Page属性如下所示:

public int Page
{
    get { return ViewState["Page"] == null ? 0: (int)ViewState["Page"]; }
    set { ViewState["Page"] = value; }
}

和此:

for (int i = pager.Start - 1 ; 
          i < queryResults.Count() && i <= (pager.Start + pager.PageSize); i++) {

位于您父控件的preRender中。

而且:

HtmlAnchor a = new HtmlAnchor();
a.HRef = "#";
a.InnerText = page.ToString();
newStartNumber = ((page - 1) * this.PageSize) + 1;
a.ServerClick += (sender, e) => { this.Start = newStartNumber; };
li.Controls.Add(a);
ul.Controls.Add(li);

位于寻呼机控件的pageload(或init)中。 (也许你不需要data-start属性)

你应该给你的HtmlAnchors提供ID。