Как реализовать шаблон Post / Redirect / Get в asp.net WebForms?

Итак, я понимаю основы шаблона prg. Но я не встречал способа сделать произвольные данные доступными для экземпляра "get" страницы.

Например, я мог бы захотеть отображать различные сообщения обратной связи для пользователя в зависимости от их действия, которое инициировало PostBack.

Я отправлял идентификатор как параметр строки запроса. Это нормально работает, но вызывает проблемы с закладками и не похоже, чтобы он хорошо масштабировался. Что, если мне нужно отправить все ViewState?

К сожалению, на данный момент я привязан к WebForms и не смог убедить свою организацию перейти на mvc.


person Ken Browning    schedule 28.05.2009    source источник


Ответы (2)


Если POSTed поля сохраняются перед перенаправлением, и вам нужно получить доступ к этим данным после перенаправления, я бы добавил идентификатор для записи (ов) данных в строку запроса, как вы упомянули. Вы также можете указать статус запроса (для отображения сообщений и т. Д.). Затем на странице GET вы можете считывать данные и делать с ними все, что угодно.

Я не вижу другого способа обойти это, поскольку каждая страница, полученная GET, не будет иметь доступа к ViewState предыдущей страницы и т. Д.

Использование Server.Transfer будет иметь тот же эффект, что и обработка POST на исходной странице.

Вы можете использовать переменные сеанса для хранения данных POST, но это плохо.

person Andrew Corkery    schedule 28.05.2009
comment
Да, я понимаю, что информацию нужно будет сохранить. Я ищу оптимальный способ реализовать это. Насколько я понимаю, Server.Transfer обходит часть перенаправления в prg. - person Ken Browning; 28.05.2009
comment
Единственные варианты, которые возникают у меня для реализации настойчивости в этом сценарии, - это хранить / извлекать данные в базе данных или файле или хранить данные в объекте Session. Вы можете сохранить объект для представления данных в POST, хотя хранение примитивных типов в Session, вероятно, более эффективно. - person Andrew Corkery; 29.05.2009

Я думаю, что вы все еще можете использовать метод get в элементе формы. В этом случае вы не сможете использовать идентификатор вашего элемента управления обычным способом. Но вы можете использовать коллекцию Request.Params для получения состояния просмотра.

Обновление: извините, я просто попробовал еще раз. и обнаружил, что вы можете получить доступ к своему элементу управления сервером по его идентификатору в коде программной части. как:

Response.Write(text1.Text)

см. пример:

страница aspx (только элемент формы):

< form id="form1" runat="server" method="get">
< div>
< asp:TextBox ID="text1" runat="server" />
< asp:Button ID="button1" runat="server" OnClick="buttonClick" />
< div>
< form>

ПРИМЕЧАНИЕ. Я использовал пробел перед каждым знаком «‹ », иначе приведенный выше код не будет виден.

код за страницей (только событие нажатия кнопки):

protected void buttonClick(object sender, EventArgs e)
    {
        string text = Request.Params["text1"];

        Response.Write(text);
    }

когда вы нажмете кнопку, URL-адрес будет выглядеть так:

HTTP: // локальный: 1157 /WebSite1/Default.aspx?__VIEWSTATE=%2FwEPDwUKMTkwNjc4NTIwMWRkoJEtEHZ8lHQ53QllSkz8ncpEw80%3D&__EVENTVALIDATION=%2FwEWAwlkf%2BJPUKRUK03&hl=ru&hl=ru&&__EVENTVALIDATION=%2FwEWAwlkf%2BjKuChw&hl=ru&html

person 24x7Programmer    schedule 28.05.2009
comment
Есть ограничения на размер строки запроса, около 2 КБ. Состояние просмотра почти всегда будет намного больше, чем это. - person GlennG; 22.03.2017