Sitecore:如何从子布局代码隐藏中获取子布局ITEM?

时间:2011-05-11 12:00:09

标签: sitecore sitecore6

我正在尝试在代码隐藏中获取子布局项(或项ID)。 这可能吗?

更新

我不是指数据源项目或当前项目,我在谈论Sublayout渲染定义项目。这与子布局文件具有一对一的关系。

代码隐藏文件:

public partial class Product_Sublayout : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Sublayout subLayout = this.Parent as Sublayout;
        Item subLayoutItem = null; //How to get sublayout rendering definition item here?
    }
}

4 个答案:

答案 0 :(得分:5)

This page将解释详细信息,但这是您需要的代码:

Sitecore.Context.Database.GetItem(((Sublayout)Parent).DataSource);

<强>更新

您可以通过使用数据库通过ID获取渲染项本身:

Sitecore.Context.Database.GetItem(((Sublayout)Parent).RenderingID);

答案 1 :(得分:3)

不需要循环控件或通过控件名称检查子布局。

执行任务的正确方法是执行以下步骤:

  1. 获取当前项目的LayoutDefinition。
  2. 使用LayoutDefinition,获取您感兴趣的子布局的RenderingDefinition。
  3. 根据完整列表获取子布局的索引
  4. 使用索引检索子布局的RenderingReference
  5. 使用RenderingReference获取对.NET控件的引用。
  6. 以下是实现目标的准则:

    LayoutDefinition layoutDef = LayoutDefinition.Parse(Sitecore.Context.Item.Fields["__renderings"].Value);
    string deviceId = Sitecore.Context.Device.ID.ToString();
    DeviceDefinition curDeviceDef = layoutDef.GetDevice(deviceId);
    RenderingDefinition renderingDef = curDeviceDef.GetRendering(Sitecore.Context.Database.Items["/sitecore/Layout/SubLayouts/MySublayout"].ID.ToString());
    int controlIndex = curDeviceDef.GetIndex(renderingDef.UniqueId);
    Control MyDotNetControl = Sitecore.Context.Page.Renderings[controlIndex].GetControl();
    

    现在你可以参考你的dot net控件了。只需将其强制转换为相应的控件即可完全访问该对象。

答案 2 :(得分:2)

要获取用于将特定Control放置到页面的Item,您可以使用名为Sublayout Parameter Helper的共享源模块。 可以找到该模块here

如果您想要检索项目,可以考虑使用以下设置:

道具:

public partial class Afbeeldingen : System.Web.UI.UserControl
{
    /// <summary>
    /// Datasource item of the current rendering
    /// </summary>
    private Sitecore.Data.Items.Item dataSource = null;

    /// <summary>
    /// Helper object to get the rendering params, datasource and rendering
    /// </summary>
    private SublayoutParamHelper paramHelper = null;

    /// <summary>
    /// Gets the data source item.
    /// </summary>
    /// <value>The data source item.</value>
    public Sitecore.Data.Items.Item DataSourceItem
    {
        get
        {
            if (this.dataSource == null)
            {
                if (this.paramHelper.DataSourceItem != null)
                {
                    this.dataSource = this.paramHelper.DataSourceItem;
                }
                else
                {
                    this.dataSource = Sitecore.Context.Item;
                }
            }

            return this.dataSource;
        }
    }

    /// <summary>
    /// Sets the data source.
    /// </summary>
    /// <value>The data source.</value>
    public string DataSource
    {
        set
        {
            this.dataSource = Sitecore.Context.Database.Items[value];
        }
    }

的Page_Load:

/// <summary>
/// Handles the Load event of the Page control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.EventArgs"/></param>
protected void Page_Load(object sender, EventArgs e)
{
if (this.Parent is Sitecore.Web.UI.WebControls.Sublayout)
{
    this.paramHelper = new SublayoutParamHelper(this, true);
}

if (this.paramHelper != null)
{
    correctItem = paramHelper.DataSourceItem;
}

从那里你可以在你的correctItem中加载Sub。 希望这可以帮助。希望我能够理解你的问题。

答案 3 :(得分:0)

这是一个单线程,可以获得Sublayout项目:

Sitecore.Context.Page.Renderings.Select(r => Sitecore.Context.Database.Items[r.RenderingID])
    .Where(item => item["Path"] == ((Sublayout)this.Parent).Path).Single();

请注意,如果由于某种原因,多个Sublayout具有相同的路径,则会失败。