Response.Redirect с POST вместо Get? - PullRequest
       126

Response.Redirect с POST вместо Get?

235 голосов
/ 05 сентября 2008

У нас есть требование принять форму и сохранить некоторые данные, а затем перенаправить пользователя на страницу вне сайта, но при перенаправлении нам нужно «отправить» форму с помощью POST, а не GET.

Я надеялся, что есть простой способ сделать это, но я начинаю думать, что нет. Я думаю, что теперь я должен создать простую другую страницу с нужной мне формой, перенаправить на нее, заполнить переменные формы, а затем выполнить вызов body.onload для сценария, который просто вызывает document.forms [0] .submit ( );

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

В любом случае, спасибо за любые ответы.

Ответы [ 14 ]

2 голосов
/ 06 сентября 2008

@ Matt,

Вы по-прежнему можете использовать HttpWebRequest, а затем направить полученный ответ на фактический ответ выходного потока, который будет возвращать ответ пользователю. Единственная проблема заключается в том, что любые относительные URL будут нарушены.

Тем не менее, это может сработать.

1 голос
/ 05 сентября 2008

Я предлагаю создать HttpWebRequest для программного выполнения POST, а затем перенаправить после прочтения Ответа, если это применимо.

0 голосов
/ 28 февраля 2019

Копируемый код, основанный на методе Павла Неймана

RedirectPost (строка url, T bodyPayload) и GetPostData () предназначены для тех, кто просто хочет выгрузить некоторые строго типизированные данные на исходной странице и извлечь их на целевой странице. Данные должны быть сериализуемы в NewtonSoft Json.NET, и вам, конечно, нужно ссылаться на библиотеку.

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

Сердечно приветствую всех вас, кто по каким-либо причинам все еще должен использовать веб-формы в 2019 году.

        protected void RedirectPost(string url, IEnumerable<KeyValuePair<string,string>> fields)
        {
            Response.Clear();

            const string template =
@"<html>
<body onload='document.forms[""form""].submit()'>
<form name='form' action='{0}' method='post'>
{1}
</form>
</body>
</html>";

            var fieldsSection = string.Join(
                    Environment.NewLine,
                    fields.Select(x => $"<input type='hidden' name='{HttpUtility.UrlEncode(x.Key)}' value='{HttpUtility.UrlEncode(x.Value)}'>")
                );

            var html = string.Format(template, HttpUtility.UrlEncode(url), fieldsSection);

            Response.Write(html);

            Response.End();
        }

        private const string JsonDataFieldName = "_jsonData";

        protected void RedirectPost<T>(string url, T bodyPayload)
        {
            var json = JsonConvert.SerializeObject(bodyPayload, Formatting.Indented);
            //explicit type declaration to prevent recursion
            IEnumerable<KeyValuePair<string, string>> postFields = new List<KeyValuePair<string, string>>()
                {new KeyValuePair<string, string>(JsonDataFieldName, json)};

            RedirectPost(url, postFields);

        }

        protected T GetPostData<T>() where T: class 
        {
            var urlEncodedFieldData = Request.Params[JsonDataFieldName];
            if (string.IsNullOrEmpty(urlEncodedFieldData))
            {
                return null;// default(T);
            }

            var fieldData = HttpUtility.UrlDecode(urlEncodedFieldData);

            var result = JsonConvert.DeserializeObject<T>(fieldData);
            return result;
        }
0 голосов
/ 30 августа 2009

Как правило, все, что вам когда-либо понадобится, - это переносить некоторое состояние между этими двумя запросами. На самом деле есть очень интересный способ сделать это, не основанный на JavaScript (подумайте

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...