Элементы управления DataPager используют URL макета Sitecore вместо URL элемента - PullRequest
2 голосов
/ 11 марта 2011

Чтобы реализовать страницу результатов поиска на сайте Sitecore 6.3.1, я создал элемент контента на /sitecore/content/Home/Search и добавил подслой результатов поиска в элементы управления его презентацией. Подуровень использует ListView для отображения результатов поиска и DataPager для обработки нумерации страниц.

Вот выдержка из Search Results.ascx:

<asp:ListView ID="SearchResults" runat="server">
  <LayoutTemplate>
    <asp:DataPager ID="Pager" QueryStringField="page" runat="server">
      <Fields>
        <asp:NumericPagerField ButtonCount="10" />
      </Fields>
    </asp:DataPager>

    <asp:Placeholder ID="itemPlaceholder" runat="server" />
  </LayoutTemplate>

  ...
</asp:ListView>

Обратите внимание, что для параметра QueryStringField в DataPager задано непустое значение.

При отображении подслоя результаты поиска и элементы управления разбиением на страницы отображаются правильно. Однако гиперссылки на нумерацию страниц идут не по адресу. Вместо перехода по URL-адресу страницы они ссылаются на URL-адрес layout .

Например, если пользователь нажимает на ссылку для страницы 2, можно ожидать, что его браузер перейдет, например, на http://www.example.com/Search.aspx?query=xyz&page=2. Но его браузер фактически ссылается на http://www.example.com/layouts/Generic%20Browser%20Layout.aspx?query=xyz&page=2.

Где DataPager получает фиктивный URL и как это исправить?

Ответы [ 2 ]

0 голосов
/ 15 марта 2011

Вот решение, с которым я в конечном итоге остановился.Это не красиво, но работает:

/// <summary>
///   Fixes any HyperLinks that point to the layout .aspx file to point to
///     the Sitecore context item.
/// </summary>
/// <param name="control">
///   The control to fix (its child controls will be processed).
/// </param>
protected void FixLayoutHyperLinks(Control control)
{
  var currentPath = LinkManager.GetItemUrl(Sitecore.Context.Item);
  foreach (Control c in control.Controls)
  {
    foreach (Control d in c.Controls)
    {
      if (d is HyperLink)
      {
        var link = (HyperLink)d;

        /* Change just the path of the existing URL.
         * @see http://stackoverflow.com/questions/5276324/modifying-just-the-path-part-of-a-hyperlinks-navigateurl-in-c/5276375#5276375
         */
        var url = new UriBuilder(Request.Url.Host + link.NavigateUrl);
        url.Path = currentPath;

        /* For consistency (and because ASP.Net will strip the leading
         *  "http://" during PreRender), do not add the hostname/schema to
         *  the resulting URI.
         * 
         * @see http://sobot-software.blogspot.com/2009/02/asphyperlink-navigateurl-problem.html
         */
        link.NavigateUrl = url.Uri.PathAndQuery;
      }
    }
  }
}

Я использую это так:

private void Page_Load(object sender, EventArgs e)
{
  ...

  var Pager = MyListView.FindControl("Pager") as DataPager;
  FixLayoutHyperLinks(Pager);
}
0 голосов
/ 14 марта 2011

Я думаю, это потому, что DataPager просто использует стандартные URL-адреса asp.net и не знает ни о Sitecore, ни о том, как Sitecore создает URL-адреса.

Я думаю, вам придется сделать это по-другому (простой повторитель) или создать DataPager, который использует Sitecore.Links.LinkManager.GetItemUrl(Sitecore.Context.Item); для ссылок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...