2011-09-14 82 views
7

我有一个问题,即中继器的视图状态,即中继器内的控件不维护其视图状态。维护中继器的视图状态

我有以下:

中继器1:

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

当链接按钮被点击被存储在页上的隐藏字段的CommandArgument的值。

回发后,我无法获取隐藏字段的值,直到prerender事件处理程序已加载。所以在我的预渲染事件中,我抓住了隐藏字段的值,并将其存储在一个列表属性,像这样:

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

而且列表属性看起来像这样:

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

一次,我已经存储值进入我的列表属性绑定我我的第二个中继器(内再次预渲染事件):

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

第二个中继器有一个下拉列表,并在其中一个文本框。问题是这些子控件的视图状态不被保留。我认为这是因为在每次回传时我都在重组中继器,因此它被重建。我不知道的是我怎么可能得到这个? ImageList属性仅在回发时更新,所以我显然必须在每次回发时重新绑定中继器 - 还可以做什么?

任何帮助将不胜感激。

感谢 铝

回答

13

如果你重新绑定中继器,你需要在加载ViewState之前做它Init

您还应该检查IsPostback标志,并且仅在页面未回传时绑定中继器。

为了澄清,如果你的第二个中继器上PreRender然后ViewState不能用于保存的控制约束,因为他们根本当ViewState加载不存在 - Init后,和以前PreLoad

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

+0

嗨CodeKing。两个问题虽然 - 我不能早在Init事件中获得隐藏字段的值 - 加上ImageList属性只能在回发时更新..... – higgsy

+0

在这种情况下,您需要重新绑定第二个中继器在使用隐藏字段中的值的每个呼叫上。 – TheCodeKing

+0

嗨CodeKing - 多数民众赞成我到底在做什么,虽然不是吗?我误解你的回应。我目前一直等到onprerender获取隐藏字段的值,然后重新绑定中继器 - 与此相关的问题是中继器中的控件的视图状态不会持续回发。 – higgsy

0

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

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

嗨Mikael - 我知道它似乎是疯狂的复制到一个隐藏的领域。问题是我也有一个jQuery图片上传在同一页 - 一旦文件上传处理程序返回新的ImageId - 当然JS不能调用ImageList.Add,因此它必须存储在一个隐藏的字段。那有意义吗? – higgsy