Коллега разрабатывает приложение веб-форм ASP.NET и хочет передавать введенную в форму информацию с одной страницы на другую.
Он спросил меня, как это должно быть сделано, и, несмотря на отсутствие большого опыта работы с веб-формами ASP.NET, я ответил, что это можно сделать как простую публикацию в форме HTML. Однако мы с трудом реализуем это на практике.
Обе страницы используют одну и ту же мастер-страницу, и эта мастер-страница определяет один элемент <form>. На первой странице (точнее, веб-форма) <asp:TextBox runat = "server" ...> элементов и один <asp:LinkButton runat = "server" ...>. Кнопка имеет OnClick = "lkbSend_Click".
В отделенном коде (в методе lkbSend_Click) мой коллега должен выполнить некоторую предварительную проверку перед отправкой информации на вторую страницу, поэтому использование атрибута PostBackUrl для LinkButton (первое предложение, которое я нашел [1], [2]) не разрешено, в по крайней мере, не из разметки aspx.
После дополнительных исследований мы нашли предложения сделать запрос POST с последующим перенаправлением из кода программной части, но это не работает, как мы ожидали, потому что это две отдельные операции — POST работает нормально, но когда пользователь перенаправляется, мы больше нет Request.Form["..."].
Третья идея, с которой я столкнулся [3], заключалась в том, чтобы добавить информацию в Context.Items, а затем использовать Server.Transfer; однако мы не можем этого сделать, потому что URL-адрес должен меняться между страницами.
В настоящее время мой коллега хранит содержимое формы в Context.Session, но ни один из нас не доволен таким подходом, поскольку мы считаем, что он не так хорошо масштабируется.
Я подумал об изменении свойства PostBackUrl кнопки ссылки в отделенном коде (в конце метода lkbSend_Click), а затем вызвать новую форму POST. Возможно ли это, и если да, то как?
Я старался:
btnSendEmail.PostBackUrl = "<another page's URL>";
btnSendEmail_OnClick(sender, e);
Но, что неудивительно, это генерирует StackOverflowException.
В случае, если это было бы невозможно, есть ли другой способ пойти?
Дополнительные примечания:
Я так понимаю, что свойства формы PostUrl нет, или оно есть?
Я только что прочитал[4], что «Вы определенно не можете размещать и перенаправлять одновременно». Это было бы правильно? Если да, то как работает HTML <form action = "..."> (и, предположительно, ASP PostBackUrl)?
Данные должны быть отправлены методом POST (т. е. не закодированы в строке URI, как в запросе GET).
Я видел предположение, что сработает перенаправление HTTP 307[5], но оно ненадежно.
Спасибо,
[1] How to pass information between web forms in asp.net
[2] asp.net 4.5 PreviousPage is null with cross page posting using a master page
[3] Redirect to another page using Post method from Code behind
[4] Action PostBackUrl Programmatically using C#
[5] Can I set a POST variable before redirecting to a new page?
[6] A good way to redirect with a POST request?
@HereticMonkey да, я видел все из них и пробовал некоторые - не тот, в частности, подумал, потому что это недостаточно просто (в основном, по той же причине, по которой нам неудобно использовать session). Кроме того, это не строго отделенный код, хотя на данный момент я подозреваю, что этот не могу должен быть выполнен в чистом отделенном коде. И если это так, я бы предпочел изменить исходную форму action (через javascript) и принудительно создать новый пост вместо того, чтобы упорядочивать каждый отдельный элемент формы в новый form по отдельности.






Вы смотрели / пробовали какие-либо другие ответы на различные вопросы, на которые вы смотрели? Например, этот ответ на Response.Redirect с помощью POST вместо Get? показывает простое создание обычного HTML
formс соответствующим атрибутомaction...