1

私はこの 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);
 }

}

4

2 に答える 2

0

Danger のアドバイスを参考にして、より信頼できる解決策を思いつきました。2007 年に大学で 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 に答える
0

答えはずっと私の目の前にあり、2と2を組み合わせる必要がありました.

page_load のステートメントを protected override void OnInit(EventArgs e) に移動したところ、問題が解決しました。

5 つのレベルの検索をテストした後、戻るボタンを使用して元の検索に戻りました。元のグリッドビュー (またはその間の任意の場所) のアイテムをクリックすると、正しい詳細レコードに移動します。スタックオーバーフローに関するすべての情報とヒントのおかげで、これは解決されました!

于 2012-09-30T14:18:24.037 に答える