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- コンテナー内のフォーム入力コントロールを再帰的に見つけるためのヘルパー メソッド (スタック オーバーフローの他の場所からつまんで修正)

注意...

  • 私たちのアプリケーションでは複数のタブが許可されていないため、複数のタブの問題には対処していません。
  • RestoreSearchResults はGridSettingsPersister.cs、Telerik Web サイトから入手できるものを利用します (ただし、ページ番号も保存するように変更する必要がありました)。

使い方は以下の...

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 に答える