2013-10-09 2 views
1

Сценарий:Как сохраняются критерии поиска и результаты переменного тока страницы приложения # .NET

  • Пользователь представляет критерии поиска и выбирает элемент из результатов поиска на одной странице, которая переходит на новую страницу деталей для выбранного элемента.

  • Когда пользователь возвращается на экран поиска, результаты поиска & результатов (включая выбранную страницу и порядок сортировки) должны быть сохранены со времени их последнего посещения.

Сопутствующая информация:

  1. Все формы представления являются должностям.
  2. Навигация по экрану поиска может быть недоступен из последней истории браузера (например, может появиться более одного подробного экрана или пользователь может перейти непосредственно к экрану поиска из альтернативного меню.)
  3. Результаты поиска с использованием управления Telerik RadGrid.
  4. Я ищу универсальное решение, которое будет применяться к различным экранам поиска.
  5. В некоторых случаях элемент может быть удален из экрана сведений и поэтому не должен появляться в результатах поиска, когда следующий экран встречается.

Мысли:

  • Я прочитал много предложенных методов для решения различных частей этого сценария, но я до сих пор путают; ни одно всестороннее «правильное» решение не выходит на первый план.

  • Я предполагаю, что я прошу рекомендации/подхода, а не в целом решение прописано для меня (хотя это было бы хорошо! ;-)

  • В .NET VIEWSTATE, казалось бы, сделать точно что я после (за исключением # 5) - Есть ли способ использовать это, чтобы viewstate можно было использовать между страницами, а не только между обратными передачами на одну и ту же страницу? (Например, можно хранить/восстановить ViewState в/из переменной сеанса или что-то? Я не видел этого предложил где-нибудь, и мне интересно, если есть причина, почему.)

Спасибо заранее.

+1

Независимо от того, что вы делаете, не сохраняйте результаты. Вы можете просто получить их снова на основе критериев. Также это не asp-classic. –

+0

Как предположил Матти, не сохраняйте результаты поиска и не полагайтесь на viewstate, viewstate - это старый способ делать вещи. Лучше будет хранить критерии поиска в сеансе и загружать сетку с результатами поиска, когда пользователь вернется на страницу результатов поиска. –

+0

Если вы используете сеанс, не забудьте сохранить какой-либо ключ в URL-адресе, чтобы система не запуталась, когда я использую ее в четырех вкладках одновременно. –

ответ

1

Спасибо за все советы.

В пользу других, здесь решение этой проблемы (не сомневаюсь, что есть возможности для улучшения, но это работает удовлетворительно на данный момент).

4 функции ...

StoreSearchCookie - Упорство государственные/значения в панели критериев поиска и таблицы результатов в куки с указанным идентификатором.

RestoreSearchCookie_Criteria - прочитать печенье и повторно заполнить поисковую criteira

RestoreSearchCookie_Results - прочитать печенье и восстановить состояние сетки.

FindFormControls - Вспомогательный метод, рекурсивно найти элементы управления форм-ввода в контейнере (зажат & изменен из других на переполнение стека)

NB ...

  • Я не обращался к Многолучевая вкладки, потому что наше приложение не позволяет им в любом случае.
  • RestoreSearchResults использует GridSettingsPersister.cs доступны на веб-сайте Telerik, (но мне пришлось изменить его, чтобы сохранить номер страницы, а)

Использование выглядит следующим образом ...

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. 
      } 
     } 
    }