维护转发器的视图状态

时间:2011-09-14 12:36:06

标签: c# asp.net repeater viewstate asprepeater

我遇到一个问题,即转发器的视图状态,即转发器中的控件不维护其视图状态。

我有以下内容:

转发器1:

<asp:Repeater ID="rptImages" runat="server">
<ItemTemplate>
    <asp:LinkButton Text="Add" CommandName="Add" CommandArgument=<%# Eval("ID") %> runat="server" />
</ItemTemplate>
</asp:Repeater>

单击链接按钮时,CommandArgument的值将存储在页面上的隐藏字段中。

回发后,在加载prerender事件处理程序之前,我无法获取隐藏字段的值。所以在我的prerender事件中,我抓住隐藏字段的值并将其存储在List属性中,如下所示:

if (!string.IsNullOrEmpty(this.SelectedImageIDsInput.Text)) {
        this.ImageList.Add(this.SelectedImageIDsInput.Text);
    }

List属性如下所示:

public List<string> ImageList {
    get {
        if (this.ViewState["ImageList"] == null) {
            this.ViewState["ImageList"] = new List<string>();
        }
        return (List<string>)(this.ViewState["ImageList"]);
    }
    set { this.ViewState["ImageString"] = value; }
}

将值存储到List属性后,我绑定了第二个转发器(再次在prerender事件中):

this.rptSelectedImages.DataSource = this.LightBoxControl.ImageList;
this.rptSelectedImages.DataBind();

第二个中继器有一个下拉列表和一个文本框。问题是不维护这些子控件的视图状态。我认为这是因为每次回发我重新绑定转发器,因此它被重建。我不知道的是我怎么可能绕过这个? ImageList属性仅在回发时更新,因此我显然必须使用每个回发重新绑定转发器 - 如何才能完成?

非常感谢任何帮助。

由于 人

2 个答案:

答案 0 :(得分:13)

如果要重新绑定转发器,则需要在Init加载ViewState之前执行此操作。

您还应检查IsPostback标记,并仅在未回发页面时绑定转发器。

为了澄清您的第二个转发器是否已绑定PreRender,则ViewState不能用于保留控件,因为在加载ViewState时它们根本不存在 - 在{{}之后1}},在Init之前。

您需要继续对每个回发进行绑定,或者在PreLoad中存储或列出,以便您可以访问列表以在Session上绑定一次(或更改时)。

答案 1 :(得分:0)

我没有看到将CommandArgument属性复制到隐藏字段的重点。您应该做的是在ItemCommand上使用Repeater事件并使用事件冒泡。您可以像Click那样处理LinkButton事件:

repeater.ItemCommand += (sender, eventArgs) => {  
   var commandArgument = eventArgs.CommandArguments;
   ImageList.Add(commandArgument);
   rptSelectedImages.DataSource = ImageList;
   rptSelectedImages.DataBind();
}