Почему коллекция Request.Form.AllKeys пуста после POST и перенаправления? - PullRequest
2 голосов
/ 14 января 2011

У меня есть страница aspx, на которой я хочу опубликовать значения на новой странице, а затем перенаправить на эту новую страницу.Я не получаю никаких ошибок, и перенаправление происходит, но коллекция AllKeys всегда пуста.

Вот пример моего кода:

Try
    With strPost
        .Append("User=" & strUserName)
        .Append("&Session=" + strValue)
    End With

    Dim objRequest As Net.HttpWebRequest = _
        Net.WebRequest.Create("http://localhost:57918/testproject/test.aspx")

    With objRequest
        .Method = "POST"
        .ContentType = "application/x-www-form-urlencoded"
        .ContentLength = strPost.ToString().Length
    End With


    Dim objStream As IO.StreamWriter = _
                New IO.StreamWriter(objRequest.GetRequestStream())
    objStream.Write(strPost.ToString)
    objStream.Close()
    Catch ex As Exception
        Debug.Print(ex.Message)
        Exit Sub
    End Try

    Response.Redirect("http://localhost:57918/testproject/test.aspx")

Я видел несколько похожих статейк этой проблеме, но никто из них не помог.Что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 14 января 2011

Почему бы вам не разместить свою главную страницу прямо на этой другой странице?

Если процесс:

  1. Страница A отображается для клиента
  2. Клиент отправляет обратно на страницу A
  3. Page Код позади генерирует запрос к странице B
  4. Страница Код позади перенаправляет пользователя на страницу B
  5. Страница B отображается для клиента

Тогда между шагами 4 и 5 вы потеряете все параметры сообщения. Вот как это работает.

Однако вы можете сделать следующее:

  1. Страница A, отображаемая клиенту, с действием для формы сообщения, установленным на страницу B
  2. Клиенты вводят информацию и нажимают кнопку "Отправить"
  3. Опубликовать значения перейдите на страницу B для обработки.

Другим путем было бы сделать так, чтобы страница А выполняла перенаправление и передавала значения в строке запроса. Например, Response.Redirect("/PageB.aspx?param1=value&param2=value")

0 голосов
/ 14 января 2011

Если я правильно понимаю, вы ожидаете, что значения POST будут доступны в /testproject/test.aspx после перенаправления.

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

Когда вы перенаправляете в конце приведенного примера совершенно новый запрос GET на новый экземпляр test.aspx. Данные POST вашего предыдущего запроса никогда не будут доступны.

Вы можете либо:

  1. Перенаправить на страницу и передать значения User и Session в строку запроса

  2. Сохраните User и Session в коллекции Session, затем перенаправьте

  3. Если strUserName и strValue происходят из другого постбэка, вы можете использовать Server.Transfer, чтобы передать управление в test.aspx и сохранить целые коллекции Form и QueryString текущего запроса. *

0 голосов
/ 14 января 2011

Приведенный выше код приведет к двум запросам на http://localhost:57918/testproject/test.aspx

  1. Сам веб-сервер размещает значения в URL. Когда страница запустится на этот раз, коллекция AllKeys будет содержать введенные вами значения.

  2. Веб-браузер клиента выполнит запрос GET к странице. Ничего не будет опубликовано. На этот раз ключи будут пустыми.

Чтобы передать параметры на другую страницу, вы можете закодировать значения в URL перенаправления:

Dim url as String = "http://localhost:57918/testproject/test.aspx"
url = url + "?User=" + strUserName
url = url + "&Session=" + strValue
Response.Redirect(url)

Значения будут доступны с использованием объекта запроса (например, Request["User"]).

обновление

Если вы не хотите показывать данные пользователю; тогда у вас действительно есть только два других варианта:

  1. Переместить обработку, выполняемую test.aspx, на страницу, которая генерировала исходный запрос.
  2. Сохраните значения User и Session в состоянии сеанса.
...