【问题标题】:Why is the Request.Form.AllKeys collection empty after a POST and Redirect?为什么在 POST 和重定向后 Request.Form.AllKeys 集合为空?
【发布时间】:2011-01-14 16:33:01
【问题描述】:

我有一个 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")

我看过一些类似这个问题的文章,但都没有帮助。我做错了什么?

【问题讨论】:

    标签: asp.net post httpwebrequest


    【解决方案1】:

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

    如果进程是:

    1. 页面 A 呈现给客户端
    2. 客户回帖到页面 A
    3. Page A 后面的代码生成对 Page B 的请求
    4. 页面 A 后面的代码将用户重定向到页面 B
    5. 页面 B 呈现给客户端

    然后在第 4 步和第 5 步之间,您将丢失所有 post 参数。这就是它的工作原理。

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

    1. 页面 A 呈现给客户端,表单发布操作设置为页面 B
    2. 客户输入信息并点击提交
    3. 帖子值转到页面 B 进行处理。

    另一种方法是让页面 A 执行重定向并传递查询字符串上的值。例如Response.Redirect("/PageB.aspx?param1=value&param2=value")

    【讨论】:

      【解决方案2】:

      如果我对此的理解是正确的,那么您预计重定向后 POST 值将在 /testproject/test.aspx 中可用。

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

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

      您可以:

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

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

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

      【讨论】:

        【解决方案3】:

        上面的代码将导致向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. 保存会话状态的UserSession 值。

        【讨论】:

        • 我尝试这样做的原因是用户看不到这些值,因此不能选择使用查询字符串。
        • 我在这里找到了可能的解决方案:codeproject.com/KB/aspnet/ASP_NETRedirectAndPost.aspx 我还没有测试,但它看起来像我需要的。
        • @Chris。您链接到的解决方案仅在您发布到的网页是另一个应用程序的一部分时才有用。如果两个页面都是同一个应用程序的一部分,我强烈建议您将值写入会话状态并重定向(例如 Session("User") = strValue)
        猜你喜欢
        • 1970-01-01
        • 2014-01-31
        • 2020-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-13
        • 1970-01-01
        • 2016-01-17
        相关资源
        最近更新 更多