【问题标题】:More back button and gridview problems更多后退按钮和gridview问题
【发布时间】:2012-09-28 16:02:05
【问题描述】:

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

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

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

公共部分类搜索: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);
 }

}

【问题讨论】:

  • 如何在页面之间存储数据?您是否在 URL 中使用 cookie 或编码搜索参数?我建议使用 URL,因为 cookie 可能会过期或被覆盖。
  • 搜索条件存储在全局变量中。搜索词被放入全局变量 Global.Searchdata。在 search.aspx 的页面加载中,变量被检索并作为参数传递给最终填充网格的 sql 语句。与 itemdetail 标准类似。当单击项目的链接按钮时,控件的命令参数被放入全局变量 ISBNData。 ItemDetail.aspx 检索值并显示该记录。

标签: c# asp.net


【解决方案1】:

答案一直就在我面前,只需将 2 和 2 放在一起即可。

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

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

【讨论】:

    【解决方案2】:

    根据 Danger 的建议,我想出了一个更可靠的解决方案。 自从我在大学学习 asp.net 后,显然情况发生了很大变化 早在 07 年(想象一下!) 无论如何,我发现如果你使用 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;
            }
        }
     }
    

    【讨论】:

      猜你喜欢
      • 2014-10-07
      • 2011-01-15
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多