0

2 ページの ASP.NET (PageA.aspx と PageB.aspx) を取得しました。各ページには複数のレコード (約 7000) を表示できます。7000 レコードすべてを表示する代わりに、ページ番号を表示する独自のナビゲーション クラスを作成しました。(Page#1 = レコード 1 から 100、Page#2 = レコード 101 から 200 など)。

PageA が読み込まれると、ナビゲーション クラスのインスタンス (シングルトン) が呼び出されます。このようにして、現在のページ番号を失うことはありません。問題は、ページ #6 で PageB.aspx に移動すると、インスタンスを作成したため、PageB.aspx がページ #6 から始まることです。Page_Load で現在のページを 1 に設定したいのですが、ご覧のとおり、Page_Load はページで何かが変更されるたびに呼び出されます :(

これを行う最善の方法は何ですか?

例として、これが私の PageA.aspx です

protected void Page_Load(object sender, EventArgs e)
{
    navigation = NavigationPage.getInstance();
    loadItems();
}

private void loadItems()
{
    ArrayList arItems = soldJobsDAO.GetQuotesToShow();
    loadPageNavigation(arItems.Count);
    // Start Table Headers
    // ...
    // End Table Headers
    int min = navigation.minPage > arItems.Count ? 0 : navigation.minPage;
    int max = navigation.maxPage > arItems.Count ? arItems.Count : navigation.maxPage;
    for (int i = min; i < max; i++)
    {
        SoldJobs job = (SoldJobs)arItems[i];
        // Start Table Rows
        // Start Table Cells
        // End Table Cells
        // End Table Rows
    }
}

private void loadPageNavigation(int maxValue)
{
    PageNavigation.Controls.Clear();
    ArrayList NavDiv = navigation.getNavigationPage(maxValue);
    for(int i = 0; i < NavDiv.Count; i++)
    {
        PageNavigation.Controls.Add((LinkButton)NavDiv[i]);
    }
}

これがナビゲーションクラスです

namespace HomeSite.Class
{
    public class NavigationPage
    {
        private static NavigationPage navigation;
        private int m_currentPage;
        private int m_minPage;
        private int m_maxPage;
        private const int NB_ITEM_PER_PAGE = 15;

        private NavigationPage()
        {
            currentPage = 1;
        }

        public static NavigationPage getInstance()
        {
            if (navigation == null) 
            {
                navigation = new NavigationPage();
            }
            return navigation;
        }

        public int currentPage
        {
            get
            {
                return m_currentPage;
            }
            set
            {
                m_currentPage = value;
                maxPage = currentPage * NB_ITEM_PER_PAGE;
                minPage = maxPage - NB_ITEM_PER_PAGE;
            }
        }

        public int minPage
        {
            get
            {
                return m_minPage;
            }
            set
            {
                m_minPage = value;
            }
        }

        public int maxPage
        {
            get
            {
                return m_maxPage;
            }
            set
            {
                m_maxPage = value;
            }
        }

        public int getNumberItemPerPages
        {
            get
            {
                return NB_ITEM_PER_PAGE;
            }
        }

        public ArrayList getNavigationPage(int maxValue)
        {
            ArrayList arItems = new ArrayList();
            int maxNbPagesToDisplay = 11;
            int nbPages = 1;
            if (maxValue > 0)
                nbPages = maxValue / getNumberItemPerPages + 1;

            if (nbPages != 1)
            {
                LinkButton link;

                // We want the current page to be centered if possible
                int FirstPageDisplayed = currentPage - (maxNbPagesToDisplay/2);
                if (FirstPageDisplayed < 1)
                    FirstPageDisplayed = 1;
                int LastPageDisplayed = FirstPageDisplayed + maxNbPagesToDisplay - 1;
                if (LastPageDisplayed > nbPages)
                    LastPageDisplayed = nbPages;

                for (int i = (FirstPageDisplayed - 1); i <= (LastPageDisplayed - 1); i++)
                {
                    int PageNumber = i + 1;

                    link = new LinkButton();
                    link.ID = "Page" + PageNumber.ToString();
                    link.Text = PageNumber.ToString();
                    link.CommandArgument = PageNumber.ToString();
                    //link.Command += LinkButton_SetCurrentPage;
                    link.Style.Add("font-size", "14px");
                    arItems.Add(link);
                }
            }
            return arItems;
        }
    }
}
4

1 に答える 1

0

このアプローチでは、他の問題に遭遇する可能性があります。私が考えることができる最も単純なシナリオは、一度に複数のユーザーがページにアクセスしている場合です。

このような状態を維持するには、次のいずれかを行う必要があります。

  • ナビゲーション状態を ViewState に保存します (セッションを使用すると、同じユーザーの複数のページで同じ問題が発生します)。
  • 現在のページを非表示フィールドに配置して、ブラウザが各リクエストでそれを送り返すようにします

私は後者をお勧めします。それは Web のステートレスな形式に近いです。

于 2012-07-13T18:54:01.187 に答える