2

我已经构建了一个具有各种属性的寻呼机控件,例如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);

所以当这些锚点被点击时,寻呼机的 Start 属性会更新,但为时已晚。

4

1 回答 1

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);

位于寻呼机控件的页面加载(或初始化)中。(也许你不需要 data-start 属性)

您应该为您的 HtmlAnchors 提供 Id。

于 2013-02-15T09:17:10.570 回答