可能是一个非常基本的初学者问题。
想象一下以下情况:
我有一个带有文本框和按钮的ASP.NET页面。在文本框中我输入让我们说一个名称“Laurel”并单击按钮。文本框作为数据源的控制参数相关,此数据源从文本框中提取内容“Laurel”以构建查询,选择客户Laurel的所有订单并将其发送回浏览器,在列表中显示它们(例如gridview)。列表很长,有两个页面(列表有一个寻呼机控件)。该列表位于文本框所在的同一页面上。所以我现在在浏览器中看到一个带有文本框的页面(仍然包含文本“Laurel”)和一个带有寻呼机的列表。
我现在可以做两件事:
实际上可能会有第三个动作:
(我的意思也可以在stackoverflow上看到:在搜索框中输入内容,例如“ASP.NET”并点击回车键,你会得到一个包含很多页面的长结果列表。然后输入另一个在搜索框中的术语,例如“PHP”,但不要输入,而是点击页面底部的寻呼机控件中的第2页。发生回发(也传输搜索框的新内容“PHP”,I猜测),显示关键字“ASP.NET”的第二页,搜索框不再包含“PHP”,而是“ASP.NET”。)
现在的问题是:我怎样才能避免这种情况?我的基本想法是:我需要在文本框中恢复旧值“Laurel”以向数据源查询提供正确的参数值,并且我的旧值“Laurel”必须存储在“某处”(在服务器上?在服务器上?在客户端?如果在客户端,隐藏在页面或cookie或......?)。是否有一些标准模式来处理这一要求?或者我在想错误的方向?
提前谢谢!
答案 0 :(得分:1)
正如您在问题中提到的,您只需将当前搜索词存储在某处,并且只在单击“搜索”按钮时才更新它。有很多选择:
大多数初学者会选择Session对象,因为它是最简单的,但也可以说是不正确的,因为Session是跨页面共享的,而你正在处理与单个页面有关的数据。因此,从标准的角度来看,其他选项之一会更好。
答案 1 :(得分:1)
您可以尝试在提交表单时在ViewState中存储搜索字词:
private void submitBtn_Click(object sender, EventArgs e) {
...
ViewState["query"] = search.Text;
...
}
然后在回发时检查此ViewState并设置search.Text属性:
private void Page_Load(object sender, EventArgs e) {
...
if (!IsPostBack) {
...
} else {
...
if (ViewState["query"] != null) {
search.Text = ViewState["query"].ToString();
}
...
}
...
}
(Stack Overflow是使用ASP.NET MVC构建的,因此不必处理回发:相反,它的搜索表单使用HTTP GET,这就是为什么你会在查询字符串中看到搜索词。搜索输入字段是如果搜索词存在于查询字符串中并且分页链接可能以类似方式构建,则可能会重新填充,因此您可以更改输入字段,不提交表单但仍然查看第2页,3,等原始查询。)