【问题标题】:sending data from one sublayout to another in sitecore在 sitecore 中将数据从一个子布局发送到另一个子布局
【发布时间】:2013-10-21 22:05:42
【问题描述】:

我很难在 Sitecore 7 中构建过滤系统。

我有 2 个子布局,位于页面的同一级别。

子布局 A 是一个侧边栏,其中包含一个复选框列表,并具有一个使用选定值填充列表的事件。 子布局 B 显示一组项目。

我想做的是将填充的列表从子布局 A 发送到子布局 B,以便根据用户选择的内容过滤项目列表。 我可以通过 Session 传递数据来做到这一点,但这不是处理该数据的最佳方式。

我尝试为子布局 A 定义一个属性并在那里加载列表,但我无法从子布局 B 获取子布局 A 的确切实例以读取填充的属性。 此外,尝试 Page.FindControl("IdOfSomeElementFromSublayoutA") 总是在子布局 B 中返回 null。即使我已将 Page 转换为包含两个子布局的 .aspx 页面。

我正在使用 Sitecore 7 Update 2。

非常感谢您的宝贵时间。

【问题讨论】:

    标签: c# asp.net sitecore sitecore7


    【解决方案1】:

    最好的方法是使用Sitecore.Events.Event 类引发(和订阅)事件。您的侧边栏子布局将在按钮的单击事件处理程序中使用以下内容引发事件:

    Sitecore.Events.Event.RaiseEvent("YourEventName", new YourEventArgsClass { Property = "SomeValue" });
    

    然后在另一个子布局中,您需要进行以下设置才能处理事件:

    public partial class YourOtherSublayout : System.Web.UI.UserControl
    {
        private System.EventHandler eventHandlerRef;
    
        protected void Page_Load(object sender, EventArgs e)
        {
            eventHandlerRef = EventHandlerMethod;
            Sitecore.Events.Event.Subscribe("YourEventName", eventHandlerRef);
        }
    
        protected void Page_Unload(object sender, EventArgs e)
        {
            if (eventHandlerRef != null)
            {
                Sitecore.Events.Event.Unsubscribe("YourEventName", eventHandlerRef);
            }
        }
    
        private void EventHandlerMethod(object sender, EventArgs e)
        {
            if (e != null)
            {
                //do stuff here
            }
        }
    }
    

    注意:保留 Page_Unload 代码很重要,否则您会看到 EventHandler 方法被多次调用。

    【讨论】:

    • 您好,感谢您的快速响应。我会尝试这种方法并告诉你它是如何进行的,尽管考虑到这应该是一项微不足道的任务,这似乎是一项相当多的工作。
    • 您的另一个选择是将两个用户控件合并在一起,但这可能不适合您所需的子布局结构?这是我发现的解决此问题的最简洁的方法,并且具有保持一切松散耦合的优势。
    • 这不是一项微不足道的任务,这实际上使它比应有的更微不足道。正如 mdresser 所说,这使得它非常松散耦合,并允许您对我的控件移动,添加到任何布局中的任何占位符中。你必须使用某种事件系统来做到这一点。
    • 这就像一个魅力,它实际上比看起来要少得多。它带来了很大的灵活性!只要您遵循命名约定以保持其可读性,就可以重用自定义事件 args 类将数据从任何控件发送到另一个控件。值得注意的是,为了从我使用过的订阅事件中检索数据:if (e != null) { var filtersHolder = Sitecore.Events.Event.ExtractParameter(e, 0) as CustomEventArgs; } 本文也有所帮助:link
    • 当我说这是一项微不足道的任务时,我的意思是指在项目开发过程中经常发生的事情。糟糕的是,Sitecore 文档充满了他们一遍又一遍地重复的一般内容,并且确实缺乏一些真正的用例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    相关资源
    最近更新 更多