要在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,我该如何解决这个问题?
答案 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); }