【问题标题】:ASP.NET: How to redirect, prefilling form data?ASP.NET:如何重定向、预填充表单数据?
【发布时间】:2010-11-06 06:47:43
【问题描述】:

我希望处理程序重定向到 Web 表单页面,预先填写表单上某些控件的值。

我尝试设置我当前的 Request.Form 数据:

if (theyWantToDoSomething)
{
   //pre-fill form values
   context.Request.Form["TextBox1"] = "test";
   context.Request.Form["ComboBox1"] = "test 2";
   context.Request.Form["TextBox2"] = GetTheTextForTheThing();

   //tell the client to go there
   context.Response.Redirect("~/SomeWebForm.aspx");
   return;        
}

但我得到一个例外,即 Form 值是只读的。

有什么方法可以将客户端发送到另一个页面,预先填写表单数据?


回答

我使用会话状态来存储值。请务必注意,默认情况下 Handler 无权访问 Session(Session 对象将为 null)。您通过将IRequiresSessionState 标记接口添加到您的处理程序类来have to tell IIS to give you the Session 对象:

public class Handler : IHttpHandler, System.Web.SessionState.IRequiresSessionState
{
   public void ProcessRequest(HttpContext context)
   {
      ...
      if (theyWantToDoSomething)
      {
         //pre-fill form values
         context.Session["thing1"] = "test";
         context.Session["thing2"] = "test 2";
         context.Session["thing3"] = GetTheTextForTheThing();

         //tell the client to go there
         context.Response.Redirect("~/SomeWebForm.aspx");
         return; //not strictly needed, since Redirect ends processing
      }
      ...
   }
}

【问题讨论】:

    标签: asp.net forms post redirect response.redirect


    【解决方案1】:

    您只能填充您的响应,请求是输入数据并且确实是只读的。

    如果您使用的是 ASP.NET,您可以通过多种方式完成您需要的工作:

    • 最好的方法可能是将需要预填充的数据通过 Session 对象传递给 SomeWebForm.aspx,然后在该页面的 Load 方法上填充表单。请记住,当您执行 Response.Redirect 时,会向客户端发送一个 302 响应,其中包含客户端应重定向到的 URL。该过程对用户是透明的……但涉及到一个完整的往返过程。

    • 填充用户会话的另一种方法是通过查询字符串将 GET 参数添加到重定向到 SomeWebForm.aspx。

    • 如果您需要将处理转移到 SomeWebForm.aspx 页面而不需要往返,您可以使用 Server.Transfer。这会将执行从当前页面转移到您选择的页面......但是,这可能会导致客户端出现一些奇怪的行为,因为 URL 不会更新。就用户而言,它仍然看起来好像他们在他们开始的同一页面上。

    【讨论】:

    • 添加到关于重定向的声明 - 发送到浏览器的 302 在新 URL 上发起 GET 请求,而不是 POST,因此您的选择是将数据存储在查询字符串或会议。您不能使用重定向执行表单样式 POST。您在帖子中暗示了这一点,但希望 Ian Boyd 清楚这一点。
    • 你可以玩一个技巧。您可以重定向到具有 JavaScript 的页面,该页面将对您真正想要的页面执行 POST。这就是 SAML SSO 的工作方式:重定向,在隐藏字段中传递数据;然后 JavaScript 转身并将这些数据 POST 到所需的页面。
    • 马特和约翰的伟大补充。当您确实需要执行 POST 而不是 GET 时,JavaScript 技巧是一个非常好的和常见的技巧。
    【解决方案2】:

    一些可以帮助您入门的想法:

    1. 传递查询字符串中的值
    2. 将值存储在会话状态或单独的 cookie 中
    3. 将值存储在 HttpContext.Items 中并使用 Server.Transfer 而不是 Response.Redirect

    【讨论】:

      【解决方案3】:

      尚未提及的另一种方法是使用 Server.Transfer 可以使用 Page.PreviousPage property,从而允许访问页面上传输控制权的控件。

      正如 jrista 所提到的,使用 Transfer 不会更新显示给用户的 URL,这可能是也可能不是问题。例如,用户不能精确地为他们转移到的页面添加书签,因为 URL 将是原始转移页面的 URL。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-06
        • 2012-08-14
        • 1970-01-01
        • 2019-07-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多