【问题标题】:Redirect without post back重定向而不回发
【发布时间】:2013-04-03 01:46:38
【问题描述】:

我有一个用户注册表单。在这里,我有另一个页面(卡信息页面)的链接,必须填写该页面才能进行注册。用户填写用户注册表单中的几个字段,然后单击进入卡信息页面的链接。当用户单击卡信息页面中的链接返回注册页面时,之前在注册中输入的详细信息消失了。所以我需要从卡信息页面重定向到注册页面而不回发。我怎样才能做到这一点?

Response.Redirect() 用于重定向。

【问题讨论】:

    标签: c# asp.net postback response.redirect


    【解决方案1】:

    我不认为没有回发就无法做到这一点。我建议将注册页面中的详细信息存储在会话状态中,然后如果用户返回该页面,请重新填充会话状态中的字段。

    //eg in registration page
    protected void CardInfoLink_Click(object sender, EventArgs e)
    {
        //store details entered
        Session["Registered"] = true;
        Session["Username"] = txtUserName.Text; 
        //etc for any other fields
        Response.Redirect("~/CardDetailsPage.aspx");
    }
    

    然后在 Page_Load 方法中,如果会话数据存在,您可以从会话预填充表单。例如

    if (!Page.IsPostback && (bool)Session["Registered"])
    {
        txtUserName.Text = (string)Session["Username"];
        //repopulate other fields as necessary
    }
    

    【讨论】:

    • 是的,我知道可以使用会话,但我在想还有其他方法吗!我在用户注册页面中有更多字段(30)
    • 我仍然认为除了存储表单信息服务器端,无论是在会话还是数据库中,或者将它们存储在 cookie 中(我认为仍然需要服务器端代码)。为了使事情变得更容易,您可以创建一个具有 get/set 属性的简单类来表示所有表单字段,然后将该类的实例存储在会话状态中,这将更易于管理。如果您想举例说明我的意思,请告诉我。
    • 谢谢..!查看答案后做了同样的事情:)
    【解决方案2】:

    当您重定向到另一个页面时,它将丢失该第一页的所有上下文,除非您采取措施阻止它。想到的选项是:

    1. 在弹出窗口中创建卡信息页面。这将意味着您的主窗口在后台保持不变。您最好使用纯客户端代码来执行此操作,但如果您需要服务器端代码来执行此操作,它仍然是可能的,只是稍微繁琐一些。

    2. 在重定向之前保存回发信息。这可能只是在会话中或在数据库中,或者如果您愿意,您甚至可以在客户端在 cookie 中进行。然后当您重新访问该页面时,您可以检查您是否已保存信息并自动加载。

    【讨论】:

      【解决方案3】:

      如果您将用户重定向到另一个页面,则该屏幕上所有捕获的信息都将丢失。视图状态不保留在重定向中,而仅保留在回发/回调中

      跨重定向维护信息的唯一方法是使用会话变量、Cookie,甚至将数据保存到数据库/XML 文件并在返回该页面时重新填充。

      我建议您在用户被定向到信息卡时保存您的信息,然后在返回时检查值并重新填充它。

      【讨论】:

        【解决方案4】:

        您可以将值存储在ViewState/Session 并重定向到另一个页面(卡信息页面),然后在返回注册页面时重新填充值。或者在同一页面中显示pop-upspanels(使用Visible 属性显示/隐藏)您可以保留用户输入。 (如果您使用服务器端控件,则值不会被清除)。

        【讨论】:

          【解决方案5】:

          Server.Transfer() 将在服务器端执行转移到另一个页面。

          更新:可以使用最初由查询字符串传输的状态来填充当前页面的Context.Items 属性。这与会话状态的行为类似,但仅限于当前请求。

          更新 2:Server.Transfer() 方法具有接受 bool 参数 preserveForm 的重载,这会保留查询字符串参数:

          http://msdn.microsoft.com/en-us/library/aa332847(v=VS.71).aspx

          【讨论】:

          • Server.Transfer 在这方面不起作用,因为用户使用需要查询字符串参数的信息卡
          • 没关系,进一步阅读似乎表明它可以根据需要保留查询字符串。
          【解决方案6】:

          您可以使用任何类型的 ajax 请求点击“转到下一页”按钮将注册数据复制到会话中。然后在返回后,您可以再次填充数据并删除会话。你的代码应该和这个类似:

          ----------------jquery ajax 请求-----------

          function SetValuesIntoSession(value1, value2, value3) {        
                  $.ajax(
                  {
                      type: "POST",
                      url: WebServicePathAndName.asmx/InsertIntoSessionMethodName",
                      contentType: "application/json; charset=utf-8",
                      data: "{value1:'" + value1 + "', value2:'" + value2 + "', value3:'" + value3 + "'}",
                      dataType: "json",
                      success: function(response) {
                          if (response.d == "Yes") {
                              //do something in correct response
                          }
                          if (response.d == "No") {
                              //do something for incorrect response
                          }
                      },
                      error: function(xhr) {
                          alert('Error!  Status = ' + xhr.status);
                      }
                  });       
          }
          

          下面是 Web 服务的代码,它应该将数据插入到会话中。请注意,如果您想在 Web 服务中使用会话状态,则必须设置“EnableSession = true”

          ----------WebServicePathAndName.asmx------

          [WebMethod( EnableSession = true )] 
          public void InsertIntoSessionMethodName( string value1, string value2, string value3 )
          {
          
              Session[ "value1" ] = value1;
              Session[ "value2" ] = value2;
              Session[ "value2" ] = value3;
          }
          

          我认为,其余的代码应该很容易实现。

          【讨论】:

            猜你喜欢
            • 2014-11-24
            • 2019-08-04
            • 2013-07-10
            • 2015-07-07
            • 2016-12-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多