Die Aufrechterhaltung der viewstate einer repeater
Ich habe ein problem, dass der viewstate der repeater, D. H. die Kontrollen innerhalb der repeater sind nicht maintaing Ihre viewstate.
Habe ich Folgendes:
Repeater 1:
<asp:Repeater ID="rptImages" runat="server">
<ItemTemplate>
<asp:LinkButton Text="Add" CommandName="Add" CommandArgument=<%# Eval("ID") %> runat="server" />
</ItemTemplate>
</asp:Repeater>
Wenn der link geklickt wird der Wert der CommandArgument gespeichert wird in einem versteckten Feld auf der Seite.
Beim postback die ich nicht bekommen kann den Wert des versteckten Feldes, bis das prerender-Ereignis-handler geladen hat. Also in meinem prerender-Ereignis schnappe ich mir den Wert des versteckten Feldes und speichern Sie es in einem List-Eigenschaft, etwa so:
if (!string.IsNullOrEmpty(this.SelectedImageIDsInput.Text)) {
this.ImageList.Add(this.SelectedImageIDsInput.Text);
}
Und die List-Eigenschaft sieht so aus:
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; }
}
Sobald ich gespeichert habe den Wert in meiner Liste Eigenschaft, die ich bind meine zweite repeater (wieder in der prerender-Ereignis):
this.rptSelectedImages.DataSource = this.LightBoxControl.ImageList;
this.rptSelectedImages.DataBind();
Den zweiten repeater hat eine dropdownlist und eine textbox innerhalb es. Das problem ist, dass der viewstate der untergeordneten Elemente ist nicht gepflegt. Ich vermute, es ist, weil mit jedem postback ich bin rebinding den repeater, deshalb ist er wieder aufgebaut. Was ich nicht weiß ist, wie kann ich möglicherweise um diese? Die ImageList-Eigenschaft wird nur aktualisiert, nach einem postback, also habe ich offensichtlich binden die repeater mit jedem postback - wie sonst kann es getan werden?
Jegliche Hilfe würde sehr geschätzt werden.
Dank
Al
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie rebinding den repeater, den Sie brauchen, um es auf
Init
vor derViewState
geladen wird.Sollten Sie auch prüfen, die
IsPostback
Flagge und nur an den repeater, wenn die Seite nicht zurück gebucht.Zu klären, ob Ihre zweite repeater gebunden ist, auf
PreRender
dannViewState
kann nicht verwendet werden, um fortbestehen zu den Kontrollen, weil Sie einfach nicht existieren, wennViewState
geladen ist - nachInit
, und vorPreLoad
.Müssen Sie entweder weiterhin verbindlich auf jedem postback, oder speichern oder Liste in
Session
so dass Sie Zugriff auf die Liste zu binden einmal aufInit
, (oder ändern).Ich sehe nicht den Sinn des Kopierens der
CommandArgument
- Eigenschaft, um ein verstecktes Feld. Was Sie tun sollten, ist die Verwendung derItemCommand
Veranstaltung auf derRepeater
und verwenden Sie Ereignis-bubbling. Du kannst mit derClick
Ereignis auf SieLinkButton
wie diese: