2013-10-09 66 views
1

場景:如何堅持搜索條件和C#.NET應用程序頁面的結果

  • 用戶提交的搜索標準,並選擇在同一頁面上的搜索結果中的項目,其導航到的詳細信息的新頁爲選定的項目。

  • 當用戶返回到搜索屏幕時,搜索標準&結果(包括選定的頁面和排序順序)應該從上次訪問時保留。

相關信息:

  1. 所有表單提交的帖子。
  2. 導航返回搜索屏幕可能無法從上次瀏覽器歷史記錄(例如,屏幕可能會遇到不止一個細節,或者用戶可以直接從另一個菜單導航到搜索屏幕。)
  3. 搜索結果使用Telerik RadGrid控件提供。
  4. 我正在尋找一種能夠應用於不同搜索屏幕的通用解決方案。
  5. 在某些情況下,可能會從細節屏幕中刪除項目,因此當下次遇到屏幕時,應該不會顯示在搜索結果中。

思考:

  • 我已經讀了很多解決此方案的各個部分建議的方法,但我仍然感到困惑;沒有全面「正確」的解決方案跳到最前沿。

  • 我想我所要求的建議/方法,而不是一個完整的解決方案闡明瞭我(雖然這將是很好!;-)

  • 的.NET VIEWSTATE似乎做正是我所追求的(除了#5之外) - 是否有一些方法可以利用這一點,以便viewstate可以在頁面之間使用,而不僅僅是在回傳到同一頁面之間? (例如,我可以存儲/到/從一個會話變量或東西嗎?我還沒有看到這個建議的任何地方,我想知道是否有一個原因,恢復視圖狀態)提前

感謝。

+1

不管你做什麼,都不要存儲結果。您可以根據標準再次獲取它們。這也不是asp-classic。 –

+0

正如Matti所建議的,不要存儲搜索結果,也不要依賴viewstate,viewstate是一種老辦法。更好的選擇是將搜索標準存儲在會話中,並在用戶返回到搜索結果頁面時在搜索結果中加載網格。 –

+0

如果您使用會話,請記住在URL中保留某種關鍵字,這樣當我在同一時間在四個選項卡中使用它時,系統不會感到困惑。 –

回答

1

感謝您的所有建議。

爲他人謀取利益,這裏是一個解決這個問題(毫無疑問,有改進的餘地,但這個工程圓滿的時刻)。

4功能...

StoreSearchCookie - 堅持的搜索標準板和與指定的UID一個cookie一個結果網格的狀態/值。

RestoreSearchCookie_Criteria - 讀取cookie並重新填充搜索criteira

RestoreSearchCookie_Results - 讀取cookie並恢復電網狀態。

FindFormControls - Helper方法遞歸地找到在容器形式的輸入控件(夾&從別處改性對堆棧溢出)

NB ...

  • 我還沒有解決的多重標籤問題,因爲我們的應用程序不允許他們。
  • RestoreSearchResults利用可從Telerik的網站GridSettingsPersister.cs,(但我不得不修改它來存儲頁碼爲好)

用法如下...

protected void Page_PreRender(object sender, EventArgs e) 
{ 
    if (Page.IsPostBack) 
    { 
     // Store the state of the page 
     StoreSearchCookie("SomeSearchPage", pnlSearchCriteria, gridResults); 
    } 
    else 
    { 
     // Restore search criteria 
     RestoreSearchCookie_Criteria("SomeSearchPage"); 

     // Re-invoke the search here 
     DoSearch(); // (for example) 

     // Restore the grid state 
     RestoreSearchCookie_Results("SomeSearchPage"); 
    } 
} 

代碼如下.. 。

protected void StoreSearchCookie(string cookieName, Panel SearchPanel, RadGrid ResultsGrid) 
    { 

     try 
     { 

      HttpCookie cookieCriteria = new HttpCookie("StoredSearchCriteria_" + cookieName); 

      // 1. Store the search criteria 
      // 
      List<Control> controls = new List<Control>(); 
      FindFormControls(controls, SearchPanel); 
      foreach (Control control in controls) 
      { 
       string id = control.ID; 
       string parentId = control.Parent.ID; 
       string uid = string.Format("{0}>{1}", parentId, id); 
       string value = ""; 

       Type type = control.GetType(); 

       bool isValidType = true;  // Optimistic! 

       if (type == typeof(TextBox)) 
       { 
        value = ((TextBox)control).Text; 
       } 
       else if (type == typeof(DropDownList)) 
       { 
        value = ((DropDownList)control).SelectedValue; 
       } 
       else if (type == typeof(HiddenField)) 
       { 
        value = ((HiddenField)control).Value; 
       } 
       else if (type == typeof(RadioButton)) 
       { 
        value = ((RadioButton)control).Checked.ToString(); 
       } 
       else if (type == typeof(CheckBox)) 
       { 
        value = ((CheckBox)control).Checked.ToString(); 
       } 
       else 
       { 
        isValidType = false; 
       } 

       if (isValidType) 
       { 
        cookieCriteria.Values[uid] = value; 
       } 

      } 

      cookieCriteria.Expires = DateTime.Now.AddDays(1d); 
      Response.Cookies.Add(cookieCriteria); 

      // 2. Persist the grid settings 
      // 
      GridSettingsPersister SavePersister = new GridSettingsPersister(ResultsGrid); 
      HttpCookie cookieResults = new HttpCookie("StoredSearchResults_" + cookieName); 
      cookieResults.Values["GridId"] = ResultsGrid.ID; 
      cookieResults.Values["GridSettings"] = SavePersister.SaveSettings(); 
      cookieResults.Expires = DateTime.Now.AddDays(1d); 
      Response.Cookies.Add(cookieResults); 

     } 
     catch (Exception exception) 
     { 
      Logger.Write(exception); 
     } 


    } 

    protected void RestoreSearchCookie_Criteria(string cookieName) 
    { 
     try 
     { 
      HttpCookie cookieCriteria = Request.Cookies["StoredSearchCriteria_" + cookieName]; 

      if (cookieCriteria != null) 
      { 

       foreach (string key in cookieCriteria.Values.AllKeys) 
       { 

        string value = cookieCriteria[key]; 
        string[] ids = key.Split('>'); 
        string parentId = ids[0]; 
        string id = ids[1]; 
        Control control = FindControl(parentId).FindControl(id);  

        Type type = control.GetType(); 

        if (type == typeof(TextBox)) 
        { 
         ((TextBox)control).Text = value; 
        } 
        else if (type == typeof(DropDownList)) 
        { 
         ((DropDownList)control).SelectByValue(value); 
        } 
        else if (type == typeof(HiddenField)) 
        { 
         ((HiddenField)control).Value = value; 
        } 
        else if (type == typeof(RadioButton)) 
        { 
         ((RadioButton)control).Checked = Boolean.Parse(value); 
        } 
        else if (type == typeof(CheckBox)) 
        { 
         ((CheckBox)control).Checked = Boolean.Parse(value); 
        } 
       } 
      } 
     } 
     catch (Exception exception) 
     { 
      Logger.Write(exception); 
     } 
    } 

    protected void RestoreSearchCookie_Results(string cookieName) 
    { 
     try 
     { 

      HttpCookie cookieResults = Request.Cookies["StoredSearchResults_" + cookieName]; 

      if (cookieResults != null) 
      { 
       string gridId = cookieResults.Values["GridId"]; 
       string settings = cookieResults.Values["GridSettings"]; 

       RadGrid grid = (RadGrid)FindControl(gridId); 

       GridSettingsPersister LoadPersister = new GridSettingsPersister(grid); 
       LoadPersister.LoadSettings(settings); 
       grid.Rebind(); 

      } 
     } 
     catch (Exception exception) 
     { 
      Logger.Write(exception); 
     } 
    } 


    private void FindFormControls(List<Control> foundSofar, Control parent) 
    { 
     List<Type> types = new List<Type> { typeof(TextBox), typeof(DropDownList), typeof(RadioButton), typeof(CheckBox), typeof(HiddenField) }; 
     foreach (Control control in parent.Controls) 
     { 
      if (types.Any(item => item == control.GetType())) 
      { 
       foundSofar.Add(control); 
      } 
      if (control.Controls.Count > 0) 
      { 
       this.FindFormControls(foundSofar, control); // Use recursion to find all descendants. 
      } 
     } 
    }