1

我即将使用这个网络应用程序,但仍然有一个明显的问题,即用户使用后退按钮后网格视图中的数据错误。这是另一个主搜索/详细信息类型页面。用户搜索项目,这些项目显示在页面 search.aspx 上的网格视图中。用户可以单击项目进入详细信息页面 itemdetails.aspx。一切正常,直到用户使用后退按钮。

例如,搜索狗,在 search.aspx 上的 gridview 中获取狗的列表。单击狗记录并在 itemdetails.aspx 上查看它们的详细信息。搜索猫,在 search.aspx 中的 gridview 上获取猫的列表。单击猫查看详细信息,使用返回返回到包含猫列表的 search.aspx,单击另一只猫查看详细信息。到目前为止一切都很好。当用户返回几次时,问题就开始了,从猫的详细信息到猫的搜索结果,再回到狗的详细信息,然后再回到狗的搜索结果。现在,如果用户单击搜索结果第 3 行中的狗,则显示的详细信息页面是最近搜索中第 3 行中的猫。

我试过清除缓存,这会强制重新加载网格,但用户总是看到页面过期页面并且必须重新提交数据。我已经尝试过 Server.Transfer 和 Response.Redirect 到搜索页面以尝试重新加载网格,但这使得用户必须单击记录两次(一次重新加载过期的网格,然后再次转到详细信息。)还尝试了重新绑定网格,以及 4-5 天左右的许多其他事情,我不记得全部了。没有任何东西可以解决问题而不产生意想不到的副作用。在这一点上,我只想要一个解决方案,即使我必须重写整个事情。感谢您的任何建议!

public partial class Search : System.Web.UI.Page { public string searchString;//用于在搜索框中输入的信息 public string searchISBN;//在gridview ISBN中保存点击的项目

private void GetProducts()
{
    try
    {
        DataSet ds = DataAccess.GetProductsPerCategory(searchString);
        GridView1.DataSource = ds;
        GridView1.DataBind();
    }
    catch (SqlException ex)
    {

        lblSearch.Text = "Cannot get product data." + ex.Message;
    }
}


protected void Button2_Click(object sender, EventArgs e)
    //button in gridview, sends to item detail page
{
    LinkButton btn = (LinkButton)(sender);
    searchISBN = btn.CommandArgument;
    //call product detail page, pass ISBN
    Global.SetISBNData = searchISBN;
    Server.Transfer("ItemDetail.aspx");
}

//when this search page is called from site.master page,
//search criteria passed to GetProducts
protected void Page_Load(object sender, EventArgs e)
{
     if (IsExpired())
    {
        Response.Redirect("Expired.aspx");
    }
    else
    {
       this.SaveTimeStamps();
        searchString = Global.GetSearchData;
        GetProducts();
    }
}

private bool IsExpired()
{
    if (Session["Search_SearchStamp"] == null)
        return false;
    else if (ViewState["SearchStamp"] == null)
        return false;
    else if (ViewState["SearchStamp"].ToString() ==
            Session["Search_SearchStamp"].ToString())
        return false;
    else
        return true;

}

private void SaveTimeStamps()
{
    DateTime dtm = DateTime.Now;
    ViewState.Add("SearchStamp", dtm);
    Session.Add("Search_SearchStamp", dtm);
 }

}

4

2 回答 2

0

答案一直就在我面前,只需要把 2 和 2 放在一起。

我将 page_load 中的语句移动到受保护的覆盖 void OnInit(EventArgs e) 并且它已经清除了一切。

我测试了 5 个级别的搜索,然后使用后退按钮返回到原始搜索。单击原始网格视图(或两者之间的任何位置)中的项目将转到正确的详细记录。感谢所有关于堆栈溢出的信息和提示,这个问题解决了!

于 2012-09-30T14:18:24.037 回答
0

从 Danger 的建议中,我想出了一个更可靠的解决方案。显然,自从 07 年我在大学学习 asp.net 以来,情况发生了很大变化(想象一下!)无论如何,我发现如果你使用 url 参数,在这种情况下情况会好得多。在 On Init 中使用全局变量和语句时,正确的事件顺序会导致故障。现在使用参数化的 url,在使用后退按钮时,显然网格总是被刷新。从我的 Murach 的书中 - 使用编码超链接的页面总是被处理,就好像它是第一次被请求一样。更新了下面的代码。一个额外的好处是这种方法允许直接链接到我的产品或搜索结果集。

//masterpage search button click
protected void btnMasterSearch_Click(object sender, EventArgs e)
    {
        //input is from the user's entry in text box
        string input = txtMasterSearch.Text;
        //result is filtered by regex then added to url for search
        string result = Regex.Replace(input, @"[^\w\.@-]", "");
        try
    {
        if (String.IsNullOrEmpty(result))
        {
            throw new ArgumentException("Null is not allowed");
        }
        else
        {
            Response.Redirect("Search.aspx?search=" + result);
        }
//search.aspx
public partial class Search : System.Web.UI.Page
{
    public string productparam;//product parameter to add to url
    public string searchparam;//search parameter from url
protected void Page_Load(object sender, EventArgs e)
    {
              searchparam = Request.QueryString["search"];
              GetProducts();
    }
private void GetProducts()
    {
        try
        {
            DataSet ds = DataAccess.GetProductsPerCategory(searchparam);
            GridView1.DataSource = ds;
            GridView1.DataBind();
        }
        catch (SqlException ex)
        {
        lblSearch.Text = "Cannot get product data." + ex.Message;
        }
    }
protected void Button2_Click(object sender, EventArgs e)
        //button in gridview, sends to item detail page
    {
        LinkButton btn = (LinkButton)(sender);
        productparam = btn.CommandArgument;
        Server.Transfer("ItemDetail.aspx?product=" + productparam);
    }
//item detail page
public partial class ItemDetail : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            lblISBN.Text = Request.QueryString["product"];
        }
        catch (Exception ex)
        {
        lblISBN.Text = "Cannot get product data." + ex.Message;
        }
    }
 }
于 2012-10-02T18:01:42.040 回答