为什么POST和重定向后Request.Form.AllKeys集合为空?

时间:2011-01-14 16:33:01

标签: asp.net post httpwebrequest

我有一个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 :(得分:0)

上面的代码会导致向http://localhost:57918/testproject/test.aspx

发出两个请求
  1. 网络服务器本身将值发布到网址。当此页面运行时,AllKeys集合将包含您发布的值。

  2. 客户端的Web浏览器将对页面执行GET请求。什么都不会发布。这次钥匙将是空白的。

  3. 为了将参数传递给其他页面,您可以对重定向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. UserSession值保存为会话状态。

答案 1 :(得分:0)

为什么不将主页直接发布到其他页面?

如果流程是:

  1. 向客户提交的页面
  2. 客户回复第A页
  3. 页面后面的代码生成对页面B的请求
  4. Page A背后的代码将用户重定向到Page B
  5. 页面B呈现给客户
  6. 然后在第4步和第5步之间,你将失去所有的后期参数。这就是它的工作原理。

    但是,您可以执行以下操作:

    1. 页面A呈现给客户端,表单发布操作设置为页面B
    2. 客户输入信息并点击提交
    3. 发布值转到第B页进行处理。
    4. 另一条路径是让页面A执行重定向并传递查询字符串上的值。例如,Response.Redirect("/PageB.aspx?param1=value&param2=value")

答案 2 :(得分:0)

如果我理解这一点,那么您希望重定向后POST中的/testproject/test.aspx值可用。

不幸的是,它不会像那样工作。当您执行WebRequest时,它是一次性的帖子。页面执行时会创建一个新请求,然后请求结束,并且将丢弃与该页面关联的所有数据。

当您在示例末尾重定向时,这是对GET的新实例的全新test.aspx请求。您之前请求的POST数据永远不可用。

你可以:

  1. 重定向到该页面并传递查询字符串中的UserSession

  2. UserSession存储在Session集合中,然后重定向

  3. 如果strUserNamestrValue来自其他回发,您可以使用Server.Transfer将控件转移到test.aspx,并保持当前请求的Form和QueryString集合不变。