1

设想:

  • 用户提交搜索条件并从同一页面上的搜索结果中选择一个项目,该页面导航到所选项目的新详细信息页面。

  • 当用户返回搜索屏幕时,搜索条件和结果(包括所选页面和排序顺序)应保留上次访问时的状态。

相关信息:

  1. 所有表单提交都是 POST。
  2. 从上次浏览器历史记录返回到搜索屏幕的导航可能不可用(例如,可能会遇到多个详细信息屏幕,或者用户可以从替代菜单直接导航到搜索屏幕。)
  3. 使用 Telerik RadGrid 控件提供搜索结果。
  4. 我正在寻找能够应用于不同搜索屏幕的通用解决方案。
  5. 在某些情况下,该项目可能会从详细信息屏幕中删除,因此下次遇到该屏幕时不应出现在搜索结果中。

想法:

  • 我已经阅读了很多解决此场景各个部分的建议方法,但我仍然感到困惑;没有全面“正确”的解决方案跳到最前沿。

  • 我想我是在寻求建议/方法,而不是为我详细说明的整个解决方案(尽管那会很好!;-)

  • .NET VIEWSTATE 似乎完全符合我的要求(#5 除外) - 是否有某种方法可以利用这一点,以便可以在页面之间使用视图状态,而不仅仅是在同一页面的回发之间?(例如,我可以将视图状态存储/恢复到会话变量或其他东西吗?我没有在任何地方看到这个建议,我想知道是否有原因。)

提前致谢。

4

1 回答 1

1

感谢所有的建议。

为了其他人的利益,这里有一个解决这个问题的方法(毫无疑问还有改进的余地,但目前这种方法令人满意)。

4个功能...

StoreSearchCookie- 将搜索条件面板和结果网格的状态/值保存在具有指定 UID 的 cookie 中。

RestoreSearchCookie_Criteria- 读取 cookie 并重新填充搜索条件

RestoreSearchCookie_Results- 读取 cookie 并恢复网格状态。

FindFormControls- 在容器中递归查找表单输入控件的辅助方法(在 Stack Overflow 上从其他地方压缩和修改)

注意...

  • 我没有解决多标签问题,因为我们的应用程序无论如何都不允许它们。
  • RestoreSearchResults 利用GridSettingsPersister.csTelerik 网站提供的,(但我必须修改它以存储页码)

用法如下...

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.
            }
        }
    }
于 2013-10-15T02:13:55.133 回答