Dropdown в .net usercontrol не поддерживает состояние - PullRequest
0 голосов
/ 15 ноября 2010

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

У меня есть usercontrol, который содержит раскрывающийся список.

<asp:DropDownList ID="ddlOrderStatus" AutoPostBack="true" runat="server" CssClass="textbox">
   <asp:ListItem value="8">Pending</asp:ListItem>
   <asp:ListItem value="9">On Hold</asp:ListItem>
   <asp:ListItem Value="11">Complete</asp:ListItem>
   <asp:ListItem Value="12">Cancelled</asp:ListItem>             
 </asp:DropDownList>

Он ничего не делает в своем событии Page_Load.

Это, в свою очередь, содержится на странице, которая в своем событии Page_Loadделает некоторые привязки данных на некоторых элементах управления повторителя на странице, но не касается элемента управления, содержащего ddl.На странице нет ajax.

В раскрывающемся списке - явно - установлено значение autopostback = true.Код обратной передачи выглядит следующим образом:

Private Sub ddlOrderStatus_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ddlOrderStatus.SelectedIndexChanged
    Dim ddl As DropDownList = DirectCast(sender, DropDownList)
    Dim currentsorting As String = Request.QueryString("sort")
    Dim currentpaging As String = Request.QueryString("page")
    Response.Redirect(String.Format("~/admin/orders/Manage/0?sort={0}&page={1}&status={2}", currentsorting, currentpaging, ddl.SelectedValue))
End Sub

Таким образом, при изменении ddl страница фактически выполняет двойную обратную передачу.Я не вижу способа избежать этого, так как мне нужно сделать обратную передачу, чтобы получить значение в ddl, а затем другую обратную передачу, чтобы получить новые данные с сервера на основе этого значения.

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

Это пагубная проблема для меня из-за такой двойной обратной передачи: если я попытаюсь установить значение ddl равным значению в строке запроса, то я эффективно установлю его на это значение постоянно, потому что Page_Load - где установлено значение- происходит до обработки событий и поэтому значение остается неизменным.Я попытался переместить код, который изменил выбранное значение ddl в Render, но казалось, что хотя выбранное значение изменилось, насколько мог видеть пользователь, выбранное значение все еще оставалось значением по умолчанию во время обработки и обрабатывалось как таковое.

Я также попытался установить значение selectedValue в сеансе, а затем очистить его, как только оно будет заполнено.Это работало для некоторых сценариев, но, к сожалению, эта страница также содержит некоторый javascript, который может заставить ее отсылать обратно - и вы не можете установить сеанс из клиентского javascript.Так что эта идея должна была выйти в окно.

Я в недоумении - эта по-видимому простая проблема съела целый день моего времени.Может ли кто-нибудь сказать мне, почему состояние не поддерживается на этом элементе управления, и / или предложить, как заставить его отображать правильное значение после обратной передачи, не превращая выбор в постоянный?

Приветствия, Мэтт

Ответы [ 2 ]

2 голосов
/ 15 ноября 2010

Загрузка вашей страницы:

// Only set the selected order status when the page first loads, but not on postbacks.
if( !Page.IsPostback )
{
    ddlOrderStatus.SelectedValue = Request.QueryString("status");
}

Сноска:

Я не вижу способа избежать этого, так как мне нужно сделать обратную передачу, чтобы получить значение в ddl изатем еще один постбэк, чтобы получить новые данные с сервера на основе этого значения.

Вы можете сделать это из javascript

1 голос
/ 15 ноября 2010

Я предвосхищу это, сказав, что я занимаюсь программированием на ASP.NET на C # и использую GridViews, но в вашей ситуации должно применяться следующее:

Вам необходимо использовать строку запроса для хранения этих данных? Если вы объявили свои элементы управления подкачкой и сортировкой на странице ASPX, вы можете получить к ним доступ и к их значениям непосредственно в своем коде (как показал Грег в приведенном выше коде, не выполняя вызов FindControl). Помогли ли вам настройки пользовательского контроля сделать это? Вы создаете экземпляр пользовательского элемента управления, содержащего этот раскрывающийся список на странице, а затем пытаетесь получить доступ к значению раскрывающегося списка из самого кода страницы, а не из кода пользовательского элемента управления позади?

...