如何从Sitecore中的另一个子布局访问子布局控件?

时间:2015-06-14 12:49:47

标签: asp.net sitecore

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

enter image description here

2 个答案:

答案 0 :(得分:3)

我之前在Sitecore网站上处理过类似的问题。我建议你考虑两种方法:

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

定义某种"接收结果"可以由任何想要处理搜索结果的子布局实现的接口。例如:

interface IRenderSearchResults
{
   void RenderResults(IEnumerable<SearchResultData> resultSet);
}

制作你的内容&#34; sublayout实现了这个接口,这样当有东西发送它的搜索结果时,它就可以处理它们:

public class ContentSublayout : Sublayout, IRenderSearchResults
{
  public void RenderResults(IEnumerable<SearchResultData> resultSet)
  {
     repeaterControl.DataSource = resultSet;
     // do whatever other data binding tasks are required
  }
}

然后扩展您的布局以获得&#34;注册我以接收搜索结果的方法&#34;并且&#34;将搜索结果发送到他们需要的地方&#34;:

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

您的内容&#34;然后,控件应该在创建时通过调用Layout上的register方法进行注册。添加如下方法:

protected void Page_Init(object sender, EventArgs e)
{
  MyLayout layout = (MyLayout)this.Page;
  layout.RegisterSearchResultsControl(this);
}

最后,当您的标题控件生成要显示的结果时,它应该通过调用Layout来调度它们:

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的事件模型 本文对事件的内部框架如何工作给出了相当有用的描述:https://adeneys.wordpress.com/2012/10/21/decoupling-through-the-sitecore-event-pool/但如果你谷歌还有其他的。

答案 1 :(得分:2)

执行此操作的最佳方法是使用查询字符串来保存搜索参数,这是执行此操作的标准尝试和测试方法。

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

使用查询字符串意味着用户可以为搜索结果添加书签,并且无需复杂的事件模型。

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