恢复文本框(或任何其他控件)的旧值

时间:2010-03-04 12:34:48

标签: asp.net controls textbox datasource

可能是一个非常基本的初学者问题。

想象一下以下情况:

我有一个带有文本框和按钮的ASP.NET页面。在文本框中我输入让我们说一个名称“Laurel”并单击按钮。文本框作为数据源的控制参数相关,此数据源从文本框中提取内容“Laurel”以构建查询,选择客户Laurel的所有订单并将其发送回浏览器,在列表中显示它们(例如gridview)。列表很长,有两个页面(列表有一个寻呼机控件)。该列表位于文本框所在的同一页面上。所以我现在在浏览器中看到一个带有文本框的页面(仍然包含文本“Laurel”)和一个带有寻呼机的列表。

我现在可以做两件事:

  • 在文本框中输入名称“Hardy”,然后单击按钮:上面的循环再次运行,并显示客户Hardy的订单。那很好,我想要的。
  • 点击寻呼机控件以显示Laurel订单的第二页。这是有效的,因为我仍然在文本框中有“Laurel”。因此,在由寻呼机控件触发的回发上,数据源可以再次从文本框中提取“Laurel”作为查询参数,运行查询并将第二页订单传送到我的浏览器。那也没关系。

实际上可能会有第三个动作:

  • 我在文本框中输入名称“Hardy”,然后改变主意并决定要查看Laurel订单的第二页。所以我在文本框中有“Hardy”,但是没有点击提交按钮,而是点击寻呼机控件的“下一页”来查看第二页。在服务器上,数据源提取文本框的内容“Hardy”,运行查询,然后尝试传递Hardy的第二页而不是Laurel的订单。所以这不是我想要的。 (也许哈迪只有几个订单,不够两页。数据源可能会告诉我“没有找到”,因为Hardy的第二页上没有任何内容。)

(我的意思也可以在stackoverflow上看到:在搜索框中输入内容,例如“ASP.NET”并点击回车键,你会得到一个包含很多页面的长结果列表。然后输入另一个在搜索框中的术语,例如“PHP”,但不要输入,而是点击页面底部的寻呼机控件中的第2页。发生回发(也传输搜索框的新内容“PHP”,I猜测),显示关键字“ASP.NET”的第二页,搜索框不再包含“PHP”,而是“ASP.NET”。)

现在的问题是:我怎样才能避免这种情况?我的基本想法是:我需要在文本框中恢复旧值“Laurel”以向数据源查询提供正确的参数值,并且我的旧值“Laurel”必须存储在“某处”(在服务器上?在服务器上?在客户端?如果在客户端,隐藏在页面或cookie或......?)。是否有一些标准模式来处理这一要求?或者我在想错误的方向?

提前谢谢!

2 个答案:

答案 0 :(得分:1)

正如您在问题中提到的,您只需将当前搜索词存储在某处,并且只在单击“搜索”按钮时才更新它。有很多选择:

  • 会话对象
  • ViewState对象
  • 作为URL上的QueryString
  • 页面上的隐藏字段

大多数初学者会选择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,等原始查询。)