1

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

非常感谢您的回复,
Harish Bhatt

4

4 回答 4

3

你可以做很多事情。

1.Cross Page Scripting

我们在 ASP.NET 1.x 版本中面临的问题之一是无法轻松地在页面之间传输数据。由于 ASP.NET 1.x 页面默认 postback 到同一个页面,并且你不能对另一个页面做 post(除非你删除 runat="server" 和其他乱七八糟的东西),访问上一页中的控件变得非常与经典 ASP 不同的是,在经典 ASP 中,您有一个动作标签来指定新页面,并且您可以使用 Request.Form 来访问以前的页面值。

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

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

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

A. 将Button的PostBackUrl属性设置为New Page,如下:-

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

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

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

请注意,使用上一页中控件 ID 的 PreviousPage 和 FindControl 声明和类型转换了一个新的 TextBox tb。但是,要在新页面内的回发中保留该值,最好将文本分配给 NewPage.aspx 中的 TextBox 或标签,以便其值不会在回发中丢失。背后的原因是,一旦您在同一页面中回发,PreviousPage 就会变得无效。

2.Sessions

您可以参考以下链接获取帮助 http://asp.net-tutorials.com/state/sessions/ example Session["Value"]="Any Data"; 您可以在任何页面访问它

3.Cookies

创建 Cookie 对象

HttpCookie _userInfoCookies = new HttpCookie("UserInfo");

在里面设置值

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

//将cookies添加到当前的web响应

Response.Cookies.Add(_userInfoCookies);
于 2013-08-22T06:21:12.910 回答
1

You can use a query string that holds the IDs of the selected items in textbox, dropdown, check box, etc., like this:

Search.aspx?textId=3&dropdownId=7

You would also need to pass these values to your results page, so they can be passed back to the search page when you want to get back.

Results.aspx?textId=3&dropdownId=7

Note: This alternative becomes unwieldy as the number of parameters increases, but it is a viable alternative to Session cache.

于 2013-08-21T17:09:03.393 回答
0

我已经在这里描述了上面的情况我试图在搜索结果页面、详细信息页面和其他页面单击返回按钮时维护搜索页面的表单数据。为了保持这一点,我使用了 Class 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; }
    }
}

我已将所有搜索条件分配给此类并将其保存在 Session 中,以便我可以在任何地方访问它。

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按钮,我将使用QueryStringPostBack=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 的好方法,但没有找到任何东西,最后得到了上述解决方案,如果有人对此有任何其他好的解决方案,请分享。谢谢!

于 2013-08-23T20:24:56.077 回答
0

我建议将客户端状态信息存储在数据库中——它们有时会很有用!您可以定义相应的行和列来表示您需要跟踪的状态信息,或者只需将所有状态信息放入持久流(使用 json、xml 等),只要您不搜索或执行 db对流式值的操作。将其放入数据库可以轻松迁移到 Web 场,或添加故障转移等。客户端状态数据库不必与应用程序的其余部分相同,以获得更高的可伸缩性。如果您使用会话状态,您还可以配置 asp.net 以将会话状态保存在数据库中以完成相同的事情。就我个人而言,我将大量使用的客户端状态存储在自定义表中,并使用通用流式方法来获取较低容量的客户端状态信息。

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

于 2013-08-21T18:07:03.690 回答