Обратная передача с измененной строкой запроса из раскрывающегося списка в ASP.NET

Моя страница asp.net будет отображать различные элементы управления в зависимости от того, какой отчет выбрал пользователь, например. для некоторых отчетов требуется 5 раскрывающихся списков, для некоторых — два флажка и 6 раскрывающихся списков).

Они могут выбрать отчет двумя способами. С помощью SelectedReport=MyReport в строке запроса или выбрав его из раскрывающегося списка. Обычно они приходят на страницу с SelectedReport в строке запроса, а затем изменяют отчет, выбранный в раскрывающемся списке.

Мой вопрос в том, есть ли способ заставить раскрывающийся список изменить строку запроса при ее выборе. Итак, я бы хотел, чтобы SelectedReport=MyNewReport в строке запроса и страница отправлялись обратно.

На данный момент выполняется обычная обратная передача, которая оставляет SelectedReport=MyReport в строке запроса, даже если это не текущий выбранный отчет.

Изменить: Мне также нужно сохранить ViewState.

Я пытался сделать Server.Transfer(Request.Path + "?SelectedReport=" + SelectedReport, true) в обработчике событий для раскрывающегося списка, и это работает с точки зрения функции, к сожалению, потому что это Server.Transfer (для сохранения ViewState) вместо Response.Redirect, URL-адрес отстает от того, что показано.

Может быть, я прошу невозможного или делаю это совершенно неправильно.

@Craig Коллекция QueryString доступна только для чтения и не может быть изменена.
@Jason Это было бы здорово, если бы я не потерял ViewState, не так ли? (Извините, я добавил это, увидев ваш ответ).


person Ray    schedule 25.08.2008    source источник


Ответы (6)


Вам нужно отключить автопостбэк в раскрывающемся списке — затем вам нужно подключить некоторый код javascript, который возьмет на себя эту роль — в коде обработчика события для события onchange для раскрывающегося списка вы должны создать URL-адрес на основе текущего — выберите значение из раскрывающегося списка и используйте javascript, чтобы затем запросить эту страницу.

РЕДАКТИРОВАТЬ: Вот какой-то быстрый и грязный код, который указывает на то, что поможет:

<script>
    function changeReport(dropDownList) {
        var selectedReport = dropDownList.options[dropDownList.selectedIndex];
        window.location = ("scratch.htm?SelectedReport=" + selectedReport.value);
    }
</script>

<select id="SelectedReport" onchange="changeReport(this)">
    <option value="foo">foo</option>
    <option value="bar">bar</option>
    <option value="baz">baz</option>
</select>

Очевидно, вам нужно будет сделать немного больше, но это действительно работает и даст вам то, что, как вам кажется, вам нужно. Я бы порекомендовал использовать набор инструментов JavaScript (я использую MochiKit, но он не для всех), чтобы выполнить более сложную работу — используйте ненавязчивые методы JavaScript, если это вообще возможно (в отличие от того, что я использую в этом примере).

@Ray: Вы используете ViewState?! Мне так жаль. :P Почему, в таком случае, вам нужно его сохранить. скажите на милость?

person Jason Bunting    schedule 25.08.2008

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

person Community    schedule 25.08.2008

Вы пытались изменить Request.QueryString[] в SelectedIndexChanged для DropDown? Это должно делать свое дело.

person Craig    schedule 25.08.2008

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

person Kevin Pang    schedule 25.08.2008

Состояние просмотра сохраняется только для несколько запросов на одну и ту же страницу. Изменение строки запроса в URL-адресе запрашивает новую страницу, тем самым очищая состояние просмотра.

Можно ли избавиться от зависимости от состояния представления, добавив дополнительные параметры строки запроса? Затем вы можете создать новый URL-адрес и Response.Redirect на него.

Другой вариант — использовать свойство Action Action. в форме, чтобы очистить строку запроса, чтобы, по крайней мере, строка запроса не противоречила тому, что отображается на странице после того, как пользователь выберет другой отчет.

Form.Action = Request.Path;
person Tom    schedule 27.08.2008

Вы можете использовать следующую функцию для изменения строки запроса при обратной передаче в asp.net с помощью сценария Webresource.axd, как показано ниже.

var url = updateQueryStringParameter(window.location.href,
                                     'Search',
                                     document.getElementById('txtSearch').value);
WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("searchbutton", "",
                                  true, "aa", url, false, true));
person Rajat Agrawal    schedule 06.06.2013