代码之家  ›  专栏  ›  技术社区  ›  Ian Boyd

ASP.NET:如何重定向、预填充表单数据?

  •  2
  • Ian Boyd  · 技术社区  · 15 年前

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

    我试着设定电流 申请表格 数据:

    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;        
    }
    

    但我有个例外 形式 值是只读的。

    如何将客户机发送到另一个页面,预先填写表单数据?


    回答

    我使用会话状态存储值。重要的是要注意,默认情况下 处理程序 无法访问 会话 (会话对象将 无效的 )你 have to tell IIS to give you the Session 通过添加 IRequiresSessionState 处理程序类的标记接口:

    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
          }
          ...
       }
    }
    
    3 回复  |  直到 15 年前
        1
  •  7
  •   Ian Boyd    15 年前

    您只能填充响应,请求是输入数据,实际上是只读的。

    如果您使用的是ASP.NET,那么有多种方法可以满足您的需要:

    • 最好的方法可能是通过session对象将需要预填充的数据传递到somewebform.aspx,然后在pages加载方法中填充表单。请记住,当您执行response.redirect时,会向客户端发送302响应,其中包含客户端应重定向到的URL。这个过程对用户来说是透明的……但是有一个完整的往返过程。

    • 填充用户会话的另一种选择是通过查询字符串添加get参数,以重定向到somewebform.aspx。

    • 如果您需要将处理传输到somewebform.aspx页面而不进行往返,那么可以使用server.transfer。这会将执行从当前页面传输到您选择的页面…但是,这可能会导致客户端出现一些奇怪的行为,因为URL不会更新。就用户而言,它仍然会出现在他们开始的同一个页面上。

        2
  •  3
  •   Jørn Schou-Rode dscher    15 年前

    一些可能让你开始的想法:

    1. 传递查询字符串中的值
    2. 将值存储在会话状态或单独的cookie中
    3. 将值存储在httpcontext.items中,并使用server.transfer而不是response.redirect
        3
  •  1
  •   Ahmad Mageed    15 年前

    另一种尚未提到的方法是使用server.transfer使使用 Page.PreviousPage property ,允许访问传输控件的页上的控件。

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