C# 维护中继器的视图状态
我有一个问题,中继器的viewstate(即中继器内的控件)没有维护其viewstate 我有以下资料: 中继器1:C# 维护中继器的视图状态,c#,asp.net,repeater,viewstate,asprepeater,C#,Asp.net,Repeater,Viewstate,Asprepeater,我有一个问题,中继器的viewstate(即中继器内的控件)没有维护其viewstate 我有以下资料: 中继器1: <asp:Repeater ID="rptImages" runat="server"> <ItemTemplate> <asp:LinkButton Text="Add" CommandName="Add" CommandArgument=<%# Eval("ID") %> runat="server" /> </I
<asp:Repeater ID="rptImages" runat="server">
<ItemTemplate>
<asp:LinkButton Text="Add" CommandName="Add" CommandArgument=<%# Eval("ID") %> runat="server" />
</ItemTemplate>
</asp:Repeater>
列表属性如下所示:
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; }
}
第二个中继器有一个下拉列表和一个文本框。问题是这些子控件的viewstate没有维护。我想这是因为每次回发我都会重新绑定转发器,因此它会被重建。我不知道的是,我怎么可能绕过这件事?ImageList属性仅在回发时更新,因此我显然必须在每次回发时重新绑定转发器-否则怎么做
任何帮助都将不胜感激
谢谢
Al如果要重新绑定中继器,则需要在加载
ViewState
之前在Init
上执行该操作
您还应该检查IsPostback
标志,并且仅在页面未发回时绑定转发器
要明确第二个中继器是否绑定在PreRender
上,则不能使用ViewState
来持久化控件,因为加载ViewState
时,在Init
之后和PreLoad
之前,控件根本不存在
您需要在每次回发时继续绑定,或者在
会话中存储或列表
,这样您就可以在Init
,(或更改时)对列表进行一次绑定。我看不出将CommandArgument
属性复制到隐藏字段的意义。您应该做的是在中继器上使用ItemCommand
事件并使用事件冒泡。您可以像这样处理链接按钮上的单击
事件:
repeater.ItemCommand += (sender, eventArgs) => {
var commandArgument = eventArgs.CommandArguments;
ImageList.Add(commandArgument);
rptSelectedImages.DataSource = ImageList;
rptSelectedImages.DataBind();
}
嗨,代码王。但是有两个问题-我不能在Init事件之前获得隐藏字段的值-加上ImageList属性只能在回发时更新…在这种情况下,您需要在每次调用时使用隐藏字段中的值重新绑定第二个中继器。嗨,编码-这正是我正在做的,不是吗?我误解了你的回答。目前,我一直等到onprerender获取隐藏字段的值,然后重新绑定中继器-问题是中继器中控件的viewstate在回发过程中不会保持不变…为了使控件保持viewstate,它们必须在预加载之前存在。这是因为ViewState是在初始化之后和预加载之前加载的。如果在PreRender上绑定转发器,则不能使用ViewState.Hi CodeKing-您的反馈没有使页面完全正常工作,但它已修复ViewState问题。谢谢米凯尔-我知道把它复制到一个隐藏的领域似乎很疯狂。问题是我在同一页面上也有一个jQuery图像上传-一旦文件上传,处理程序返回新的ImageId-当然JS不能调用ImageList.Add,所以它必须存储在一个隐藏字段中。这有意义吗?中描述了可能的解决方法
this.rptSelectedImages.DataSource = this.LightBoxControl.ImageList;
this.rptSelectedImages.DataBind();
repeater.ItemCommand += (sender, eventArgs) => {
var commandArgument = eventArgs.CommandArguments;
ImageList.Add(commandArgument);
rptSelectedImages.DataSource = ImageList;
rptSelectedImages.DataBind();
}