Поддержание состояния ретранслятора - PullRequest
7 голосов
/ 14 сентября 2011

У меня есть проблема, из-за которой состояние представления повторителя, т.е. элементы управления в повторителе, не поддерживают свое состояние представления.

У меня есть следующее:

Повторитель 1:

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

При нажатии на кнопку ссылки значение CommandArgument сохраняется в скрытом поле на странице.

При обратной передаче я не могу получить значение скрытого поля, пока обработчик события prerender не имеетзагружен.Поэтому в моем событии prerender я беру значение скрытого поля и сохраняю его в свойстве List, например:

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

И свойство List выглядит так:

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

После сохранения значения в свойстве List я связываю свой второй повторитель (снова в событии prerender):

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

Второй повторитель имеет раскрывающийся список и текстовое поле внутри него.Проблема в том, что состояние этих дочерних элементов управления не поддерживается.Я предполагаю, что это потому, что с каждой обратной передачей я привязываю ретранслятор, поэтому он перестраивается.То, что я не знаю, как я могу обойти это?Свойство ImageList обновляется только при обратной передаче, поэтому мне, очевидно, приходится перепривязывать ретранслятор при каждой обратной передаче - как еще это можно сделать?

Любая помощь будет принята с благодарностью.

Спасибо, Ал

Ответы [ 2 ]

13 голосов
/ 14 сентября 2011

Если вы привязываете ретранслятор, вам нужно сделать это на Init до загрузки ViewState.

Вы также должны установить флажок IsPostback и привязывать ретранслятор только тогда, когда страница не отправлена ​​обратно.

Чтобы выяснить, связан ли ваш второй ретранслятор с PreRender, тогда ViewStateне может использоваться для сохранения элементов управления, потому что они просто не существуют при загрузке ViewState - после Init и до PreLoad.

Вам нужно либо продолжать связывание при каждой обратной передаче, либосохранить или список в Session, чтобы у вас был доступ к списку, который можно привязать один раз к Init, (или при изменении).

0 голосов
/ 14 сентября 2011

Не вижу смысла копировать свойство CommandArgument в скрытое поле. Вам следует использовать событие ItemCommand на Repeater и использовать всплывающее окно события. Вы можете обработать событие Click на вас LinkButton следующим образом:

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