Восстановление старого значения текстового поля (или любого другого элемента управления) - PullRequest
1 голос
/ 04 марта 2010

Наверное, очень простой вопрос для начинающих.

Представьте себе следующую ситуацию:

У меня есть страница ASP.NET с текстовым полем и кнопкой. В текстовое поле я ввожу, скажем, имя «Лавр» и нажимаю кнопку. Текстовое поле связано как параметр управления с источником данных, и этот источник данных извлекает содержимое «Laurel» из текстового поля для создания запроса, выбирает все заказы клиента Laurel и отправляет их обратно в браузер, где они отображаются в списке. (Вид сетки, например). Список длинный и имеет две страницы (в списке есть пейджер). Список находится на той же странице, где также находится текстовое поле. Итак, теперь я вижу в своем браузере страницу с текстовым полем (все еще содержащим текст «Laurel») и список с пейджером.

Теперь я могу сделать два действия:

  • Введите имя «Харди» в текстовое поле и нажмите на кнопку: вышеуказанный цикл снова запускается, и отображаются заказы клиента Харди. Это нормально, и я хочу.
  • Нажмите на элемент управления пейджером, чтобы отобразить вторую страницу заказов Лорел. Это работает, потому что у меня все еще есть "Лавр" в текстовом поле. Таким образом, при обратной передаче, инициируемой элементом управления пейджером, источник данных может снова извлечь «Laurel» как параметр запроса из текстового поля, выполнить запрос и доставить вторую страницу заказов в мой браузер. Это тоже хорошо.

На самом деле может быть третье действие:

  • Я ввожу имя «Харди» в текстовое поле, затем передумал и решил, что хочу увидеть вторую страницу ордена Лорел. Таким образом, у меня есть «Харди» в текстовом поле, но я не нажимаю кнопку «Отправить», а вместо этого я нажимаю «Следующая страница» элемента управления пейджером, чтобы просмотреть вторую страницу. На сервере источник данных извлекает содержимое «Харди» из текстового поля, запускает запрос и затем пытается доставить вторую страницу Харди вместо заказов Лорел. Так что это не то, что я хочу. (Возможно, у Харди всего несколько заказов, недостаточно для двух страниц. Источник данных может сказать мне тогда «Ничего не найдено», потому что на второй странице для Харди ничего нет.)

(То, что я имею в виду, можно также увидеть здесь на stackoverflow: введите что-то в поле поиска, например «ASP.NET» и нажмите клавишу ввода, вы получите длинный список результатов со многими страницами. Затем введите другой термин в окне поиска, например, «PHP», но не нажимайте ввод, вместо этого нажмите на странице 2 в элементе управления пейджером внизу страницы. Произошла обратная передача (которая также передает новое содержимое «PHP» окна поиска, я угадайте), отображается вторая страница с ключевым словом «ASP.NET», и окно поиска больше не содержит «PHP», а вместо этого снова «ASP.NET».)

Вопрос сейчас: как мне избежать подобной ситуации? Моя основная идея такова: мне нужно восстановить старое значение "Laurel" в текстовом поле, чтобы обеспечить правильное значение параметра для запроса источника данных, и мое старое значение "Laurel" должно храниться "где-то" (на сервере? Где на сервере? на клиенте - если на клиенте, спрятаны на странице или в cookie или ...?). Существуют ли стандартные шаблоны для решения этого требования? Или я не в том направлении?

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 04 марта 2010

Вы можете попытаться сохранить поисковый запрос в ViewState при отправке формы:

private void submitBtn_Click(object sender, EventArgs e) {
    ...
    ViewState["query"] = search.Text;
    ...
}

Затем проверьте это ViewState при обратной передаче и установите свойство search.Text:

private void Page_Load(object sender, EventArgs e) {
    ...
    if (!IsPostBack) {
        ...
    } else {
        ...
        if (ViewState["query"] != null) {
            search.Text = ViewState["query"].ToString();
        }
        ...
    }
    ... 
}

(Переполнение стека построено с использованием ASP.NET MVC, поэтому не нужно иметь дело с обратными передачами: вместо этого в его поисковой форме используется HTTP GET, поэтому вы увидите условия поиска в строке запроса. Поле ввода поиска вероятно, повторно заполнится, если поисковый термин существует в строке запроса и ссылки на страницы будут, вероятно, построены аналогичным образом, поэтому вы можете изменить поле ввода: не отправить форму, но все равно просмотреть страницу 2, 3 и т. Д. Вашего исходного запроса).

1 голос
/ 04 марта 2010

Как вы упоминаете в своем вопросе, вам просто нужно где-то сохранить текущий поисковый запрос и обновлять его только при нажатии кнопки «Поиск». Есть много вариантов:

  • Сеансовый объект
  • объект ViewState
  • как QueryString для URL
  • скрытое поле на странице

Большинство новичков выбирают объект Session, поскольку он является самым простым, но он также, возможно, некорректен, так как Session разделяется между страницами, и вы имеете дело с данными, относящимися к одной странице. Поэтому один из других вариантов будет лучше, с точки зрения стандартов.

...