Ответ.Перенаправить ту же страницу RadioButtonList SelectedItem

#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. Предполагая, что вы вставили приведенный выше код, который действительно отличается от вашего, из-за внесенных мной изменений, он фактически добавляет фильтры. Извините, у вас возникли проблемы с этим.