#c# #asp.net #postback #radiobuttonlist #request.querystring
#c# #asp.net #обратная отправка #RadioButtonList #запрос.Строка запроса
Вопрос:
Я пытаюсь выполнить фильтр заданий для списка заданий на нашем веб-сайте. Фильтр для типа задания помещается в панель обновления, а кнопка для применения фильтров перенаправляет обратно на ту же страницу.
Это потому, что я буду использовать umbraco.library:RequestQueryString в XSLT для заполнения списка заданий.
Однако значение фильтра строки запроса, похоже, не выбирает RadioButtonList. Например:
Страница загружается, но ничего не происходит, потому что vt равно null:
protected void Page_Load(object sender, EventArgs e)
{
string vt = Request.QueryString["vt"];
if (vt != null)
{
foreach (ListItem li in rblVacancyType.Items)
{
if (li.Value == vt)
{
li.Selected = true;
}
}
}
}
<asp:UpdatePanel ID="upSearchFilters" runat="server">
<ContentTemplate>
<p>
<asp:RadioButtonList ID="rblVacancyType" runat="server">
<asp:ListItem Text="All" Value="all"></asp:ListItem>
<asp:ListItem Text="Permanent" Value="permanent"></asp:ListItem>
<asp:ListItem Text="Temporary" Value="temporary"></asp:ListItem>
</asp:RadioButtonList>
</p>
</ContentTemplate>
</asp:UpdatePanel>
Вот кнопка:
<asp:ImageButton ID="ibFilters" ImageUrl="~/images/buttons/filter-button.png" OnClick="ibApplyFilters_Click" runat="server" />
Вот процедура:
protected void ibApplyFilters_Click(object sender, EventArgs e)
{
Response.Redirect("/careers/join-us/?filters=trueamp;vt=" rblVacancyType.SelectedValue.ToString());
}
Тем не менее, когда страница перенаправляется в первый раз, ничего не выбрано, я нажимаю постоянный, выбирается постоянный. Если я затем выберу «Все» или «Временный», выбор не изменится.
Есть идеи?
Комментарии:
1. Сделайте выпадающий список autopostback=true.
2. Когда вы проходите и отлаживаете. Что он делает при начальной загрузке страницы, когда ничего не меняется? Всегда ли он проходит через правильное выбранное значение при нажатии?
3. Нет, я просто делаю это сейчас. У меня есть точка останова на ibApplyFilters_Click, при первом нажатии он выбирает выбранное значение, когда я меняю и нажимаю его во второй раз, выбранное значение остается неизменным. Я пытался добавить EnableViewState=»false» в RadioButtonList и кнопку безрезультатно.
Ответ №1:
На основе поведения (это работает в первый раз) Я считаю, что это описывает, что происходит:
- MyPage.aspx (исходная загрузка)
- Элементы управления страницей инициализированы по умолчанию
- Загрузка страницы — нет строки запроса, переключатель не выбран
(пользователь нажимает кнопку — вызывает обратную отправку)
- MyPage.aspx (обратная отправка)
- Элементы управления страницей инициализированы по умолчанию
- Переключатель установлен из ViewState
- Загрузка страницы — нет строки запроса, переключатель не выбран
- ButtonClick — использует настройку переключателя, перенаправляет ответ
- MyPage.aspx?VT=Постоянный (загружается из перенаправления)
- Элементы управления страницей инициализированы по умолчанию
- Загрузка страницы — строка запроса установлена, переключатель выбран
(пользователь нажимает кнопку — вызывает обратную отправку)
- MyPage.aspx?VT=постоянный (обратная отправка)
- Элементы управления страницей инициализированы по умолчанию
- Переключатель установлен из ViewState
- Загрузка страницы — строка запроса установлена, переключатель установлен на постоянный (вот в чем проблема)
- ButtonClick — использует настройку переключателя, перенаправляет ответ
Я считаю, что простой (если!IsPostBack) исправит ситуацию
Комментарии:
1. Привет, Марк, спасибо за вашу оценку. Я немного удивляюсь, что кнопка не является отправкой назад, а перенаправлением. Конечно, кнопка должна изменить ответ. Перенаправление в соответствии с тем, что выбрано в RadioButtonList, затем перенаправление, но именно этот бит, похоже, не выполняется.
2. Да, проверка IsPostBack решила проблему, я бы отменил ее из-за перенаправления, но теперь, когда я посмотрел на вашу разбивку, я вижу, где что-то не так — спасибо.
Ответ №2:
Похоже, значения обратной передачи применяются повторно. См. Эту статью о ASP.NET жизненный цикл страницы: http://msdn.microsoft.com/en-us/library/ms178472.aspx .
Значения для элементов управления повторно применяются с помощью обратной передачи после загрузки страницы.
Комментарии:
1. Разве это не ответное сообщение? Кнопка должна отвечать. Перенаправление … нет?
Ответ №3:
Из-за странной природы кода обратных отправлений логика в ответе Марка кажется довольно точной, но предложенное исправление не сработало, поскольку я пробовал это как возможное решение. Ниже приведена модификация, но, насколько я мог видеть, она работает. Попробуйте, у вас может получиться.
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="upSearchFilters" runat="server">
<ContentTemplate>
<p>
<asp:RadioButtonList ID="rblVacancyType" runat="server"
AutoPostBack="True">
<asp:ListItem Text="All" Value="all"></asp:ListItem>
<asp:ListItem Text="Permanent" Value="permanent"></asp:ListItem>
<asp:ListItem Text="Temporary" Value="temporary"></asp:ListItem>
</asp:RadioButtonList>
</p>
<p>
<asp:ImageButton ID="ibFilters" runat="server" CausesValidation="False"
Height="30px" OnClick="ibApplyFilters_Click" />
</p>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
Код позади:
protected void Page_Load(object sender, EventArgs e)
{
ibFilters.PostBackUrl = "~/WebForm1.aspx?filters=trueamp;vt=" rblVacancyType.Text;
string vt = Request.QueryString["vt"];
}
Важно:
Способ, которым это настроено, сохранит ваш выбор, обновит параметры фильтра в URL-адресе при нажатии кнопки, а затем присвоит vt правильное значение, которое будет использоваться при фильтрации чего-либо еще на вашей странице.
Вы также должны изменить мой «~/WebForm1.aspx?filters=trueamp; vt=» для вашего URL.
Комментарии:
1. Привет, KreepN, я попробовал ваше решение, но PostBackUrl не добавляет фильтры в конец поиска.
2. Предполагая, что вы вставили приведенный выше код, который действительно отличается от вашего, из-за внесенных мной изменений, он фактически добавляет фильтры. Извините, у вас возникли проблемы с этим.