点击asp.net返回按钮即可管理表单数据(通过会话或Viewstate处理除外)

本文关键字:会话 Viewstate 处理 返回 net asp 按钮 管理表单数据 点击 | 更新日期: 2023-09-27 18:28:27

我在搜索页面上有一个表单,包含文本框、下拉列表和复选框。选择"搜索条件"并单击"搜索"按钮后,搜索结果将显示在另一个页面上。我正在使用搜索结果页面上的asp按钮返回搜索页面,我想保留表单数据(文本框、下拉列表/复选框的选择等,这些都是我之前为搜索所做的)。我已经通过Session和Viewstate实现了它,所以我想知道一些其他的管理方法。

非常感谢您的回复,
Harish Bhatt

点击asp.net返回按钮即可管理表单数据(通过会话或Viewstate处理除外)

你可以做很多事情。

1.Cross Page Scripting

在ASP.NET 1.x版本中,我们面临的问题之一是无法轻松地在页面之间传输数据。由于ASP.NET 1.x页面默认情况下会回发到同一页面,并且您无法将其发布到另一页面(除非删除runat="server"和其他混乱的内容),因此访问前一页面中的控件变得非常困难,这与经典ASP不同,在经典ASP中,您有一个操作标记来指定新页面,并且可以使用Request.Form来访问前一页的值。

在ASP.NET 2.0中,有一种更有效的方法可以访问上一页中的控件。它使用页面的PreviousPage属性。

假设我们有一个页面Default.aspx,其中有一个文本框"Text1"和一个按钮"Button1"。

我们可以通过以下步骤从另一个页面访问Default.aspx中的控件:-

A。将按钮的PostBackUrl属性设置为新页面,如下所示:-

<asp:Button ID="button1" Runat=server Text="submit" PostBackUrl="~/NewPage.aspx" />

B。然后,在NewPage.aspx中,您可以访问Default.aspx上的TextBox控件,如下所示:-

  public void page_load()
    {
    if(!IsPostBack)
    {
    TextBox tb = (TextBox)PreviousPage.FindControl("Text1");
    Response.Write(tb.Text);}
    }

请注意,新的TextBox tb是使用PreviousPage和上一页中控件ID的FindControl声明和类型转换的。但是,要在新页面中保留跨回发的值,最好将文本分配给NewPage.aspx中的TextBox或Label,这样其值就不会在跨回发中丢失。背后的原因是,一旦在同一页面中回发,PreviousPage就会失效。

2.Sessions

您可以参考以下链接以获得帮助http://asp.net-tutorials.com/state/sessions/实例Session["Value"]="任意数据";您可以在任何页面中访问它

3.Cookies

创建Cookie对象

HttpCookie _userInfoCookies = new HttpCookie("UserInfo");

内部设置值

_userInfoCookies["UserName"] = "Abhijit";
_userInfoCookies["UserColor"] = "Red";
_userInfoCookies["Expire"] = "5 Days";

//将cookie添加到当前web响应

Response.Cookies.Add(_userInfoCookies);

您可以使用一个查询字符串,其中包含文本框、下拉列表、复选框等中所选项目的ID,如下所示:

Search.aspx?textId=3&dropdownId=7

您还需要将这些值传递到结果页面,以便在您想要返回时将它们传递回搜索页面。

Results.aspx?textId=3&dropdownId=7

注意:随着参数数量的增加,这种替代方案变得很难使用,但它是Session缓存的可行替代方案。

我建议将客户端状态信息存储在数据库中——这样偶尔会有用!您可以定义相应的行和列来表示需要跟踪的状态信息,或者只需将所有状态信息放入一个持久流中(使用json、xml等),只要您不想对流式值进行搜索或执行db操作即可。将其放在数据库中可以方便地迁移到web场或添加故障转移等。客户端状态数据库数据库不必与应用程序的其他数据库相同,即可获得更大的可扩展性。如果您使用的是sessionstate,那么您还可以配置asp.net将会话状态保存在数据库中以完成同样的任务。就我个人而言,我将大量使用的客户端状态存储在自定义表中,并使用通用的流式方法来获取较低容量的客户端状态信息。

诀窍是使用sessionid作为密钥(或sessionid+XKEY),如果您需要在同一个表中存储多个状态信息副本,则需要使用XKEY。例如在店面应用程序XKEY上可能表示页面#等。我还使用它来生成一个唯一的XKEY,并在uri查询参数列表中传递XKEY——您只需要在一页又一页中保持XKEY即可,而不需要一长串参数。

我已经在这里描述了上面的情况,我试图在搜索结果页面、详细信息页面和其他页面中单击"上一步"按钮来维护搜索页面的表单数据。为了保持这一点,我使用了类SearchCriteria。以下是类的示例代码

public class SearchCriteria
{
    private string _strName;
    private string _strCode;
    public string strName
    {
        set { _strName = value; }
        get { return _strName; }
    }
    public string strCode
    {
        set { _strCode = value; }
        get { return _strCode; }
    }
}

我已经将所有搜索条件分配给这个类,并将其保留在会话中,这样我就可以在任何地方访问它。

SearchCriteria objSearch = new SearchCriteria();
objSearch.strName =  txtFirstName.Text;
objSearch.strCode = txtCode.Text ;
if (Session["SearchCriteria"] != null)
{
   Session.Remove("SearchCriteria");
   Session["SearchCriteria"] = objSearch;
}
else
{
   Session["SearchCriteria"] = objSearch;
}

点击搜索结果、详细信息和其他页面中的Back按钮,我将重定向到QueryString PostBack=1 的搜索页面

protected void btnBack_Click(object sender, EventArgs e)
{
    Response.Redirect("Default.aspx?PostBack=1", false);
}  

在搜索页面的Page_Load上,我检查了"QueryString"PostBack,并根据QueryString,将搜索条件分配给会话中的控件。

if (Request.QueryString["PostBack"] != null)
{
    SearchCriteria objSearch = new SearchCriteria();
    if (Session["SearchCriteria"] != null)
    {
         objSearch = (SearchCriteria)Session["SearchCriteria"];
         txtFirstName.Text = objSearch.strName;
        txtCode.Text = objSearch.strCode;
    }
}

我不知道在不同的情况下推荐什么,但我想知道。请分享你的想法。

非常感谢Ashish Bahu,他的回答在这方面帮了我很多。

我一直在寻找任何其他不使用Session或Viewstate的好方法来实现这一点,但没有找到任何东西,最终得到了上述解决方案。如果有人对此有任何其他好的解决方案,请分享。谢谢