DataPager控件使用Sitecore布局URL而不是项URL

时间:2011-03-10 23:07:04

标签: sitecore sitecore6 datapager

要在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>

请注意,DataPager的QueryStringField参数设置为非空值。

渲染子布局时,搜索结果和分页控件会正确显示。但是,分页超链接会转到错误的URL。它们不是转到页面URL,而是链接到 layout 的URL。

例如,如果用户点击第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 :(得分:0)

我认为这是因为DataPager只使用标准的asp.net网址,并且不了解Sitecore或Sitecore创建网址的方式。

我认为您必须以另一种方式(简单的转发器)执行此操作,或者创建一个使用Sitecore.Links.LinkManager.GetItemUrl(Sitecore.Context.Item);作为链接基础的DataPager。

答案 1 :(得分:0)

这是我最终采用的解决方案。它不漂亮,但确实有效:

/// <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);
}