首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更多后退按钮和网格视图问题

更多后退按钮和网格视图问题
EN

Stack Overflow用户
提问于 2012-09-29 00:02:06
回答 2查看 1.2K关注 0票数 1

我即将上线这个web应用,但仍然有一个明显的问题,那就是用户使用后退按钮后,网格视图中的数据是错误的。这是另一个主搜索/详细类型页面。用户搜索项目,这些项目显示在页面search.aspx的网格视图中。用户可以单击项目以转到详细信息页面itemdetails.aspx。在用户使用“后退”按钮之前,一切工作正常。

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

我尝试过清除缓存,这会强制网格重新加载,但用户总是看到页面过期,因此必须重新提交数据。我尝试了Server.Transfer和Response.Redirect到搜索页面,以尝试重新加载网格,但这使得用户必须单击记录两次(一次是重新加载过期的网格,另一次是转到详细信息)。我也尝试过重新绑定网格,还有很多其他的事情,大概4-5天,我都记不住了。没有什么能解决这个问题而不产生意想不到的副作用。在这一点上,我只想要一个解决方案,即使我必须重写整个东西。谢谢你的建议!

公共分部类搜索: System.Web.UI.Page { public string searchString;//对于在搜索框public string searchISBN中键入的信息;//在网格视图ISBN中保存点击的项

代码语言:javascript
复制
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);
 }

}

EN

回答 2

Stack Overflow用户

发布于 2012-09-30 22:18:24

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

我将page_load中的语句移到了protected override void OnInit(EventArgs e)中,它已经把事情搞清楚了。

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

票数 0
EN

Stack Overflow用户

发布于 2012-10-03 02:01:42

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

代码语言:javascript
复制
//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;
        }
    }
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12643446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档