Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更多后退按钮和gridview问题_C#_Asp.net - Fatal编程技术网

C# 更多后退按钮和gridview问题

C# 更多后退按钮和gridview问题,c#,asp.net,C#,Asp.net,我即将使用这个web应用程序,但仍然有一个突出的问题,那就是用户使用“后退”按钮后GridView中的数据错误。这是另一个mastersearch/detail类型页面。用户搜索显示在search.aspx页面的gridview中的项目。用户可以单击项目转到详细信息页面itemdetails.aspx。在用户使用“后退”按钮之前,所有操作都正常 例如,搜索狗,在search.aspx上获取gridview中的狗列表。单击dog records并在itemdetails.aspx上查看其详细信息。

我即将使用这个web应用程序,但仍然有一个突出的问题,那就是用户使用“后退”按钮后GridView中的数据错误。这是另一个mastersearch/detail类型页面。用户搜索显示在search.aspx页面的gridview中的项目。用户可以单击项目转到详细信息页面itemdetails.aspx。在用户使用“后退”按钮之前,所有操作都正常

例如,搜索狗,在search.aspx上获取gridview中的狗列表。单击dog records并在itemdetails.aspx上查看其详细信息。搜索猫,在Search.aspx中的gridview上获取猫的列表。单击“猫”查看详细信息,使用“上一步”返回搜索。aspx包含猫的列表,单击其他猫查看详细信息。到目前为止一切都很好。问题开始于用户返回几次,从cat详细信息到cat搜索结果,再到狗的详细信息,再到狗的搜索结果。现在,如果用户单击搜索结果第3行中的狗,则显示的详细信息页面是最近搜索中第3行中的猫

我尝试过清除缓存,这会强制重新加载网格,但用户总是看到过期的页面,必须重新提交数据。我已经尝试过服务器、传输和响应、重定向到搜索页面以尝试重新加载网格,但这使得用户必须单击记录两次(一次重新加载过期的网格,然后再次转到详细信息)。还尝试了重新绑定网格,以及在4-5天左右的时间内执行的许多其他操作,我都记不清了。如果不产生意外的副作用,就无法解决问题。在这一点上,我只是想要一个解决方案,即使我必须重写整个事情。谢谢你的建议

公共部分类搜索:System.Web.UI.Page { 公共字符串searchString;//用于搜索框中键入的信息 公共字符串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);
 }

}

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

我将page_load中的语句移动到protectedoverride void OnInit(EventArgs e)中,它已经清除了所有内容


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

根据丹格的建议,我想出了一个更可靠的解决方案。 显然,自从我在大学里学习asp.net以来,情况发生了很大的变化 早在07年(想象一下!) 不管怎样,我发现如果使用url参数,效果会更好 在这种情况下。只要事件顺序正确,就会导致故障 在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;
        }
    }
 }

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