Как мне поддерживать viewstate на пользовательском элементе управления - PullRequest
1 голос
/ 26 февраля 2010

У меня есть ASP-страница, которая использует два списка и сторонний элемент управления (Fluent.ListTransfer) для передачи значений из одного списка в другой. Довольно стандартный материал:

<td>
    <asp:ListBox ID="ListBoxAvailable" Runat="server"  
        SelectionMode="Multiple" EnableViewState="true">
    </asp:ListBox>
</td>
<td style="vertical-align: middle">
    <a href="#" onclick="<%= ListTransfer1.ClientMoveSelected %>" ><img src="img/RightArrow.jpg" alt=">>"/></a>
    <br />
    <a href="#" onclick="<%= ListTransfer1.ClientMoveBackSelected %>"><img src="img/LeftArrow.jpg" alt="<<"/></a>

</td>
<td>
    <asp:ListBox ID="ListBoxSelected" Runat="server"  
        SelectionMode="Multiple" EnableViewState="true">
    </asp:ListBox>
</td>

В событии Controls Page_load я установил содержимое полей 'available' и 'selected' с некоторыми sql:

    protected void Page_Load(object sender, EventArgs e)
    {

        if (IsPostBack)
            return;

        // Some code to work through a recordset, adding values 
        // to the selected or available list boxes

Я предполагал, что на обратных передачах viewstate будет заботиться о состоянии списков, измененных пользователем (в конце концов, они являются стандартными элементами управления ASP). Тем не менее, оба списка остаются пустыми, если я выполняю обратную передачу.

Как правильно поддерживать состояние списков между постбэками?

Спасибо за любую помощь

Ryan

Ответы [ 2 ]

2 голосов
/ 26 февраля 2010

ViewState похож на «шпиона» на стороне клиента. Всякий раз, когда происходит изменение на стороне клиента, ViewState сообщит (читай: PostBack) об изменениях на сервере, чтобы сервер мог повторно обработать страницу.

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

Полагаю, ваша Fluent.ListTransfer - это функция на стороне клиента.

Некоторые решения:

Магазин списка только в ViewState выбранный пункт (я думаю, только индекс), не все элементы из списка, так что он знает только для восстановления выбранный пункт, а не весь список. Является немного странно, но это логика. к mantain в ViewState все элементы, которые вы может написать новый ListBox, полученный из ListBox или HtmlSelect, но вы должны обрабатывать в то же время вероятность того, что элементы из списка поле будет изменено на клиенте с помощью код JavaScript.


Когда страница отправляет назад ни один из элементы в списке отправляются обратно сервер за исключением тех, которые ВЫБРАН на клиенте. Это делает смысл, когда вы думаете об этом. забывать о viewstate и всем остальном. Вы можно выбрать несколько элементов, чтобы сделать все элементы, которые вы добавляете в список 2 выбран.


Еще один обходной путь, но не так элегантный. Основная идея заключается в записи все элементы в одном списке контролировать и снова заполнять списки используя значение элемента управления каждый раз страница отправляется обратно. С надеждой кто-то может придумать что-то лучше:

  1. Поместите скрытый ввод на вашей веб-странице. Не забудьте поставить RUNAT = SERVER атрибут, чтобы вы могли ссылаться ваш вклад из вашего кода ASP.NET позади.

  2. В вашем Javascript, когда вы изменяете содержимое одного списка, объединить все значения - используя разделитель - и поместите значение в ваш скрытый вход.

  3. В вашем коде Page_Load поместите код, чтобы прочитать скрытый ввод, разделите значения и заполните ListBoxes.

Надеюсь, это все поможет ...

0 голосов
/ 26 февраля 2010

Если я правильно понимаю ваш код, вы перемещаете ListItems на стороне клиента из одного ListBox в другой. Но ListBoxes не представляют весь свой контент - только выбранные элементы. Так что вы должны это поддерживать. Я не знаю, если Fluent.ListTransfer сделает это для вас.

...