Помните нумерацию страниц при возврате на страницу с ListView / DataPager - PullRequest
2 голосов
/ 25 января 2012

У меня есть простой ListView, разбитый на страницы DataPager, дающий список продуктов. Когда мы нажимаем на продукт, мы открываем страницу с информацией о продукте. На странице с подробностями мы хотим «вернуться к списку продуктов», но, конечно, мы хотим, чтобы она помнила, на какой странице находился пейджер данных.

Конечно, это было задумано как естественное требование к дизайну - каков простой способ сделать это из коробки?

Если мы используем свойство QueryStringField для DataPager, мы получаем номер страницы в URL-адресе, поэтому я надеялся, что смогу использовать URL-адрес реферера в обратной ссылке, но я обнаружил, что Request.UrlReferrer ненадежен (когда я использую F5 для например, отладить приложение в Internet Explorer, Request.UrlReferrer всегда имеет значение null).

Я нашел некоторый успех в сохранении номера страницы в переменной сеанса:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            if (Session["PagerIndex"] != null)
            {
                DataPager1.SetPageProperties((int)Session["PagerIndex"],
                  DataPager1.MaximumRows, false);
            }
        }
    }

    protected void DataPager1_PreRender(object sender, EventArgs e)
    {
        if (Page.IsPostBack)
        {
            Session["PagerIndex"] = DataPager1.StartRowIndex;
        }
    }

Этот метод имеет некоторые недостатки:

  1. Работает только в том случае, если QueryStringField пусто (поэтому может быть обнаружен IsPostBack)
  2. Переменная Session / cookie требуется для каждого пейджера
  3. Возникает вопрос, как сбросить переменные сеанса / cookie

Каков «правильный» способ сделать это?

Спасибо

Ответы [ 2 ]

2 голосов
/ 26 января 2012

Вы можете попробовать мое решение Задайте для свойства QueryStringField вашего информационного пейджера поле строки запроса, скажем.

 <asp:DataPager ID="DataPager2" runat="server" PagedControlID="ListView1" 
    QueryStringField="page">
    ....

Примечание. Я разместил DataPager за пределами ListView.

Поместите linkButton в ваш список просмотра, который перенаправит вас на страницу сведений и в своем событии щелчка сохранит номер текущей страницы в сеансе

 int integ;
    decimal fract;
    integ = DataPager2.StartRowIndex / DataPager2.PageSize;
    fract = (DataPager2.StartRowIndex / DataPager2.PageSize) - integ;
    if (fract > 0)
        page = integ;
    else if (integ > 0) page = integ - 1;
  Session["page"]=page;

На странице сведений найдите страницу и передайте ее в виде строки запроса на страницу ListView. Автоматически пейджер данных перенесет вас на этот номер страницы, если он не указан для номера страницы 1.

Удачи!

1 голос
/ 25 января 2012

Если у вас нет фильтров, вы можете просто пересчитать страницу, на которой был продукт.

Другим вариантом будет кодирование страницы (вместе с возможными значениями фильтра для списка) в URL-адресе страницы сведений о продукте и использование их для создания URL-адреса для списка, который по существу будет таким же, как и для Оригинальный список. Даже что-то вроде подхода ReturnUrl используется для входа в систему. Sharepoint делает то же самое со своими списками, но я чувствую, что URL может стать слишком грязным (и я не тот человек, который впадает в полную чушь «чистого URL», когда я говорю, что это действительно грязно)

Еще один вариант - передать идентификатор продукта на страницу списка через URL. Страница списка может затем рассчитать соответствующую страницу. Это позволит удалить шум из URL

...