Asp.net 如何从Sitecore中的另一个子布局访问子布局控制?

Asp.net 如何从Sitecore中的另一个子布局访问子布局控制?,asp.net,sitecore,Asp.net,Sitecore,我有主布局和三个子布局页眉,内容,页脚。在标题子布局中,我有搜索文本框和搜索按钮,单击搜索按钮结果将显示在内容子布局上,在内容子布局中,我有转发器,但我无法访问标题子布局中的转发器控制 最好的方法是使用querystring来保存搜索参数,这是一种经过尝试和测试的标准方法 当用户按下搜索按钮时,您需要重定向到添加了queryString参数的当前页面。然后让带有repeater的子布局读取querystring参数以列出结果,而不是将数据从一个子布局传递到另一个子布局 querystring的使

我有主布局和三个子布局页眉,内容,页脚。在标题子布局中,我有搜索文本框和搜索按钮,单击搜索按钮结果将显示在内容子布局上,在内容子布局中,我有转发器,但我无法访问标题子布局中的转发器控制


最好的方法是使用querystring来保存搜索参数,这是一种经过尝试和测试的标准方法

当用户按下搜索按钮时,您需要重定向到添加了queryString参数的当前页面。然后让带有repeater的子布局读取querystring参数以列出结果,而不是将数据从一个子布局传递到另一个子布局

querystring的使用意味着用户可以将搜索结果添加到书签中,并且不再需要复杂的事件模型


另外,通过使用浏览器布局作为传递数据的媒介,意味着您将子布局和浏览器布局紧密耦合,如果您需要在其他地方使用子布局,这可能不好。

我以前在Sitecore站点中处理过类似的问题。我建议您考虑以下两种方法:

1) 使用一些自定义代码,布局可以充当子布局的中介

定义某种类型的“接收结果”接口,该接口可由任何希望处理搜索结果的子布局实现。例如:

interface IRenderSearchResults
{
   void RenderResults(IEnumerable<SearchResultData> resultSet);
}
最后,当标头控件生成要显示的结果时,它应该通过调用布局来分派这些结果:

public class MyHeader : SubLayout
{
  public void DoTheSearch()
  {
    // whatever you do to perform a search

    MyLayout layout = (MyLayout)this.Page;    
    layout.DispatchSearchResults(theSearchResults);
  }
}
(这段代码是在我的头顶上输入的,而不是复制/粘贴的-因此可能会有拼写错误-抱歉)

这样,任何一组结果接收控件都可以存在于页面上的任何位置(如果需要,可以通过页面编辑器添加/删除),但只要运行搜索,如果它们位于页面上,就会得到结果。这种方法还允许您将结果的分页UI或结果摘要显示到单独的控件中,编辑器可以在页面中移动这些控件

请注意,如果站点上有多个版面,则可能需要确保调度代码位于所有版面的基类中,以确保在编辑器更改特定页面的版面时始终可用

2) 您可能会使用Sitecore的事件模型
这篇文章对事件内部框架的工作原理进行了相当有益的描述:但如果你用谷歌搜索,还有其他框架。

谢谢戴维斯……我尝试了第二个选项,它对我有效。
public class MyLayout : Page
{
  private List<IRenderSearchResults> resultControls = new List<IRenderSearchResults>();

  public void RegisterSearchResultsControl(IRenderSearchResults control)
  {
    resultControls.Add(control);
  }

  public void DispatchSearchResults(IEnumerable<SearchResultData> resultSet)
  {
     foreach(var control in resultControls)
     {
        control.RenderResults(resultSet);
     }
  }
}
protected void Page_Init(object sender, EventArgs e)
{
  MyLayout layout = (MyLayout)this.Page;
  layout.RegisterSearchResultsControl(this);
}
public class MyHeader : SubLayout
{
  public void DoTheSearch()
  {
    // whatever you do to perform a search

    MyLayout layout = (MyLayout)this.Page;    
    layout.DispatchSearchResults(theSearchResults);
  }
}