C# 维护中继器的视图状态

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

我有一个问题,中继器的viewstate(即中继器内的控件)没有维护其viewstate

我有以下资料:

中继器1:

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