Возможно, это что-то фундаментальное и глупое, что я упустил, но различные обходные пути вызывают у меня такие огромные головные боли, что мне действительно нужно понять основную проблему здесь, чтобы найти лучшее решение.
У меня есть 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.Так что эта идея должна была выйти в окно.
Я в недоумении - эта по-видимому простая проблема съела целый день моего времени.Может ли кто-нибудь сказать мне, почему состояние не поддерживается на этом элементе управления, и / или предложить, как заставить его отображать правильное значение после обратной передачи, не превращая выбор в постоянный?
Приветствия, Мэтт