2

为了在 Sitecore 6.3.1 站点上实现搜索结果页面,我创建了一个内容项,/sitecore/content/Home/Search并将一个搜索结果子布局添加到其演示控件中。子布局使用 ListView 来显示搜索结果,并使用 DataPager 来处理分页。

以下是摘录Search Results.ascx

<asp:ListView ID="SearchResults" runat="server">
  <布局模板>
    <asp:DataPager ID="Pager" QueryStringField="page" runat="server">
      <字段>
        <asp:NumericPagerField ButtonCount="10" />
      </字段>
    </asp:DataPager>

    <asp:Placeholder ID="itemPlaceholder" runat="server" />
  </布局模板>

  ...
</asp:ListView>

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

渲染子布局时,搜索结果和分页控件会正确显示。但是,分页超链接会转到错误的 URL。它们没有转到页面 URL,而是链接到布局的 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,我该如何解决?

4

2 回答 2

0

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

/// <总结>
/// 修复指向布局 .aspx 文件的所有超链接以指向
/// Sitecore 上下文项。
/// </总结>
/// <param name="control">
/// 要修复的控件(将处理其子控件)。
/// </参数>
protected void FixLayoutHyperLinks(Control control)
{
  var currentPath = LinkManager.GetItemUrl(Sitecore.Context.Item);
  foreach(control.Controls 中的控制 c)
  {
    foreach(c.Controls 中的控制 d)
    {
      if (d 是超链接)
      {
        var 链接 = (超链接)d;

        /* 仅更改现有 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 = 当前路径;

        /* 为了一致性(并且因为 ASP.Net 将去除前导
         * "http://" 在 PreRender 期间),不要将主机名/模式添加到
         * 生成的 URI。
         *
         * @see http://sobot-software.blogspot.com/2009/02/asphyperlink-navigateurl-problem.html
         */
        链接.NavigateUrl = url.Uri.PathAndQuery;
      }
    }
  }
}

我像这样使用它:

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

  var Pager = MyListView.FindControl("Pager") as DataPager;
  FixLayoutHyperLinks(Pager);
}
于 2011-03-14T21:34:40.723 回答
0

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

我认为您将不得不以另一种方式(简单的中继器)执行此操作,或者创建一个Sitecore.Links.LinkManager.GetItemUrl(Sitecore.Context.Item);用于链接基础的 DataPager。

于 2011-03-14T12:14:05.737 回答