7

我有一个问题,即转发器的视图状态,即转发器中的控件没有保持它们的视图状态。

我有以下内容:

中继器 1:

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

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

回发后,在加载预渲染事件处理程序之前,我无法获取隐藏字段的值。因此,在我的预渲染事件中,我获取隐藏字段的值并将其存储在 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 属性仅在回发时更新,因此我显然必须在每次回发时重新绑定转发器 - 还能怎么做?

任何帮助将不胜感激。

谢谢艾尔

4

2 回答 2

13

如果要重新绑定中继器,则需要在加载Init之前进行。ViewState

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

为了澄清您的第二个中继器是否已绑定,PreRenderViewState不能用于持久化控件,因为它们在ViewState加载时根本不存在 - afterInit和 before PreLoad

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

于 2011-09-14T12:41:43.740 回答
0

我看不出将CommandArgument属性复制到隐藏字段的意义。您应该做的是使用ItemCommand事件Repeater并使用事件冒泡。您可以像这样处理您的Click事件LinkButton

repeater.ItemCommand += (sender, eventArgs) => {  
   var commandArgument = eventArgs.CommandArguments;
   ImageList.Add(commandArgument);
   rptSelectedImages.DataSource = ImageList;
   rptSelectedImages.DataBind();
}
于 2011-09-14T12:48:54.860 回答