0

我需要从我的子布局中以编程方式获取渲染参数。目前我这样做:

var sublayout = ((Sublayout)this.Parent);
//Get all rendering
var renderings = Sitecore.Context.Item.Visualization.GetRenderings(Sitecore.Context.Device, true);

//Get the first rendering that matches the current sublayout's path
var sublayoutRendering = renderings.FirstOrDefault(r => r.RenderingItem.InnerItem["Path"] == sublayout.Path);

if (sublayoutRendering != null)
    Response.Write(sublayoutRendering.RenderingItem.Parameters);

这个解决方案来自这个问题并且完美地工作,直到我在页面上有两个相同类型的子布局。当这种情况发生时,显然总是返回与两个renderings.FirstOrDefault(r => r.RenderingItem.InnerItem["Path"] == sublayout.Path);子布局的子布局路径匹配的第一个渲染参数。

我怎样才能区分它们?我看不到任何东西可以用来将它们绑在一起!


编辑:

为了清楚起见,我在Presentation > Details中添加了我的子布局,然后当我单击我的控件时,我在“控件属性”窗口中设置了字段。我有一个名为 Module Source 的字段,它总是返回相同的 - 它总是填充为顺序中最高的一个。每个子布局的值肯定不同,但我无法从渲染中获取它们。

4

2 回答 2

1

不确定我是否遗漏了什么。但是您可以直接在子布局上获取子布局渲染参数。我在用于所有 Sitecore 子布局的基本子布局上使用以下内容 - 多次插入同一子布局上的渲染参数没有问题 :)

    protected Sitecore.Web.UI.WebControls.Sublayout CurrentSublayout
    {
        get
        {
            Control c = Parent;
            while (c != null && !(c is Sitecore.Web.UI.WebControls.Sublayout))
            {
                c = c.Parent;
                if (c == null)
                    break;
            }

            return c as Sitecore.Web.UI.WebControls.Sublayout;
        }
    }

    protected NameValueCollection CurrentParameters
    {
        get
        {
            if (CurrentSublayout == null)
                return null;

            NameValueCollection parms = WebUtil.ParseUrlParameters(CurrentSublayout.Parameters);

            var sanitizedValues = new NameValueCollection();
            for (int i = 0; i < parms.Count; i++)
            {
                if (!string.IsNullOrEmpty(parms[i]))
                    sanitizedValues.Add(parms.Keys[i], parms[i]);
            }

            return sanitizedValues;
        }
    }
于 2012-05-16T12:48:11.707 回答
0

您可能需要检查子布局上的缓存设置,如果您没有 Cacheable VarbyParam 它不会为您工作

于 2014-07-25T17:59:41.563 回答