2011-09-14 115 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