维护转发器的视图状态
我有一个问题,即转发器的视图状态,即转发器内的控件不维护其视图状态。
我有以下内容:
中继器1:
<asp:LinkButton Text="Add" CommandName="Add" CommandArgument= runat="server" />
单击链接按钮时,CommandArgument的值将存储在页面上的隐藏字段中。
回发后,在加载prerender事件处理程序之前,我无法获取隐藏字段的值。 所以在我的prerender事件中,我获取隐藏字段的值并将其存储在List属性中,如下所示:
if (!string.IsNullOrEmpty(this.SelectedImageIDsInput.Text)) { this.ImageList.Add(this.SelectedImageIDsInput.Text); }
List属性如下所示:
public List ImageList { get { if (this.ViewState["ImageList"] == null) { this.ViewState["ImageList"] = new List(); } return (List)(this.ViewState["ImageList"]); } set { this.ViewState["ImageString"] = value; } }
一旦我将值存储到我的List属性中,我就绑定了我的第二个转发器(再次在prerender事件中):
this.rptSelectedImages.DataSource = this.LightBoxControl.ImageList; this.rptSelectedImages.DataBind();
第二个中继器有一个下拉列表和一个文本框。 问题是不维护这些子控件的视图状态。 我认为这是因为每次回发我重新绑定转发器,因此它被重建。 我不知道的是我怎么可能绕过这个? ImageList属性仅在回发时更新,因此我显然必须使用每个回发重新绑定转发器 – 如何才能完成?
任何帮助将不胜感激。
谢谢Al
如果要重新绑定转发器,则需要在加载ViewState
之前在Init
上执行此操作。
您还应检查IsPostback
标志,并仅在未回发页面时绑定转发器。
为了澄清你的第二个转发器是否绑定在PreRender
那么ViewState
不能用于持久化控件,因为它们在加载ViewState
时不存在 – 在Init
之后和PreLoad
之前。
您需要在每个回发上继续绑定,或者在Session
存储或列出,以便您可以访问列表以在Init
(或更改)上绑定一次。
我没有看到将CommandArgument
属性复制到隐藏字段的重点。 您应该做的是在Repeater
上使用ItemCommand
事件并使用事件冒泡。 您可以像这样处理LinkButton
上的Click
事件:
repeater.ItemCommand += (sender, eventArgs) => { var commandArgument = eventArgs.CommandArguments; ImageList.Add(commandArgument); rptSelectedImages.DataSource = ImageList; rptSelectedImages.DataBind(); }