我在搜索页面上有一个包含文本框、下拉列表、复选框的表单。选择搜索条件并单击搜索按钮后,搜索结果将显示在另一个页面上。我正在使用搜索结果页面上的 asp 按钮返回搜索页面,并且我想保留表单数据(我之前为搜索所做的文本框、下拉菜单/复选框的选择等)。我已经通过 Session 和 Viewstate 实现了它,所以我想知道一些其他的方法来管理它。
非常感谢您的回复,
Harish Bhatt
我在搜索页面上有一个包含文本框、下拉列表、复选框的表单。选择搜索条件并单击搜索按钮后,搜索结果将显示在另一个页面上。我正在使用搜索结果页面上的 asp 按钮返回搜索页面,并且我想保留表单数据(我之前为搜索所做的文本框、下拉菜单/复选框的选择等)。我已经通过 Session 和 Viewstate 实现了它,所以我想知道一些其他的方法来管理它。
非常感谢您的回复,
Harish Bhatt
你可以做很多事情。
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);
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.
我已经在这里描述了上面的情况我试图在搜索结果页面、详细信息页面和其他页面单击返回按钮时维护搜索页面的表单数据。为了保持这一点,我使用了 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
按钮,我将使用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 的好方法,但没有找到任何东西,最后得到了上述解决方案,如果有人对此有任何其他好的解决方案,请分享。谢谢!
我建议将客户端状态信息存储在数据库中——它们有时会很有用!您可以定义相应的行和列来表示您需要跟踪的状态信息,或者只需将所有状态信息放入持久流(使用 json、xml 等),只要您不搜索或执行 db对流式值的操作。将其放入数据库可以轻松迁移到 Web 场,或添加故障转移等。客户端状态数据库不必与应用程序的其余部分相同,以获得更高的可伸缩性。如果您使用会话状态,您还可以配置 asp.net 以将会话状态保存在数据库中以完成相同的事情。就我个人而言,我将大量使用的客户端状态存储在自定义表中,并使用通用流式方法来获取较低容量的客户端状态信息。
诀窍是使用 sessionid 作为键(或 sessionid + XKEY),如果您需要在同一个表中存储状态信息的多个副本,则需要 XKEY。例如,在店面应用程序上,XKEY 可能代表页面# 或类似内容。我还使用它来生成唯一的 XKEY 并在 uri 查询参数列表中传递 XKEY —— 您只需在页面之间保留 XKEY,而不是一长串参数。