2012-09-28 2 views
1

나는이 웹 응용 프로그램을 사용하여 생방송에 가깝지만 사용자가 뒤로 버튼을 사용한 후 gridviews의 잘못된 데이터 인 한 가지 눈부신 문제가 여전히 있습니다. 이것은 또 다른 mastersearch/detail 유형 페이지입니다. 사용자는 search.aspx 페이지의 gridview에 표시되는 항목을 검색합니다. 사용자는 항목을 클릭하여 세부 정보 페이지 인 itemdetails.aspx로 이동할 수 있습니다. 사용자가 뒤로 버튼을 사용할 때까지 모두 제대로 작동합니다.더 많은 뒤로 버튼 및 gridview 문제

예를 들어 dog를 검색하고 search.aspx에서 gridview의 개 목록을 가져옵니다. 개 레코드를 클릭하고 itemdetails.aspx에 대한 세부 정보를보십시오. 고양이를 검색하고 search.aspx의 gridview에서 고양이 목록을 얻으십시오. 세부 정보를 보려면 고양이를 클릭하고, 고양이 목록으로 search.aspx로 돌아가려면 세부 정보를 보려면 다른 고양이를 클릭하십시오. 지금까지는 괜찮습니다. 문제는 사용자가 고양이 세부에서 고양이 검색 재개발, 개 세부 사항으로 돌아간 다음 개 검색 결과로 돌아갈 때까지 몇 번 뒤로 가면 시작됩니다. 이제 사용자가 검색 결과 행 3에서 개를 클릭하면 가장 최근 검색에서 행 3의 고양이가 표시됩니다.

캐시를 지우려고했는데, 그리드를 강제로 다시로드하지만 사용자는 항상 페이지 만료 페이지를보고 데이터를 다시 제출해야합니다. 나는 Server.Transfer 및 Response.Redirect 검색 페이지를 그리드를 다시로드하려고 시도했지만 사용자가 레코드를 두 번 클릭해야합니다. 한 번 만료 된 그리드를 다시로드 한 다음 다시 세부 사항으로 이동해야합니다. 또한 그리드 리바운드를 시도하고 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); 
} 

}

+0

어떻게 페이지간에 데이터를 저장하고 있습니까? URL에 쿠키 또는 코딩 검색 매개 변수를 사용하고 있습니까? 쿠키가 만료되거나 덮어 쓸 수 있으므로 URL을 권하고 싶습니다. –

+0

검색 조건은 전역 변수에 저장됩니다.검색 용어는 Global.Searchdata 변수에 저장됩니다. search.aspx의 pageload에서 변수가 검색되고 마지막에 그리드를 채우는 SQL 문에 매개 변수로 전달됩니다. itemdetail 기준과 유사합니다. 항목의 링크 버튼을 클릭하면 컨트롤의 명령문이 전역 변수 ISBNData에 저장됩니다. ItemDetail.aspx는 값을 검색하고 해당 레코드를 표시합니다. – user1706348

답변

0

정답은 나와 내 앞에서 2시와 2 분을 맞추기 만하면됩니다.

page_load의 문장을 보호 된 재정의 void OnInit (EventArgs e)로 옮겼습니다. 문제가 해결되었습니다.

5 단계의 검색을 통해 테스트 한 다음 뒤로 버튼을 사용하여 원래 검색으로 돌아갑니다. 원래 그리드 뷰 (또는 중간에있는 모든 항목)의 항목을 클릭하면 올바른 상세 레코드로 이동합니다. 스택 오버 플로우에 대한 모든 정보와 팁 덕분에이 문제가 해결되었습니다!

0

위험으로부터의 조언을 받아 들인 나는보다 신뢰할만한 해결책을 찾았습니다. 대학에서 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\[email protected]]", ""); 
     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; 
     } 
    } 
}