私はこの Web アプリを使い始めようとしていますが、ユーザーが [戻る] ボタンを使用した後、グリッドビューのデータが正しくないという明らかな問題がまだ 1 つあります。これは別のマスターサーチ/詳細タイプのページです。ユーザーはアイテムを検索し、ページ search.aspx のグリッドビューに表示されます。ユーザーはアイテムをクリックして、詳細ページ itemdetails.aspx に移動できます。ユーザーが戻るボタンを使用するまで、すべて正常に機能します。
たとえば、犬を検索し、search.aspx のグリッドビューで犬のリストを取得します。犬の記録をクリックして、itemdetails.aspx で詳細を確認します。猫を検索し、search.aspx の gridview で猫のリストを取得します。猫をクリックして詳細を表示し、戻るを使用して猫のリストを含む search.aspx に戻り、別の猫をクリックして詳細を表示します。これまでのところ、すべて問題ありません。問題は、ユーザーが猫の詳細から猫の検索結果に戻り、犬の詳細に戻り、犬の検索結果に戻ったときに発生します。ユーザーが検索結果の行 3 で犬をクリックすると、表示される詳細ページは最新の検索の行 3 の猫です。
キャッシュをクリアしようとしましたが、これによりグリッドが強制的にリロードされますが、ユーザーはページの有効期限が切れたページを常に表示し、データを再送信する必要があります。Server.Transfer と Response.Redirect を検索ページに移動してグリッドをリロードしようとしましたが、これにより、ユーザーはレコードを 2 回クリックする必要があります (期限切れのグリッドをリロードするために 1 回、詳細に移動するためにもう一度クリックします)。また、グリッドの再バインドを試みましたが、他の多くのことを 4 ~ 5 日ほどかけて行ったので、すべてを覚えているわけではありません。予期しない副作用を引き起こさずに問題を解決したものはありません。この時点で、すべてを書き直さなければならない場合でも、解決策が必要です。ご提案ありがとうございます。
public partial class Search : System.Web.UI.Page { public string searchString;// 検索ボックスに入力された情報 public string searchISBN;// グリッドビュー 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);
}
}