我正在尝试在代码隐藏中获取子布局项(或项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?
}
}
答案 0 :(得分:5)
This page将解释详细信息,但这是您需要的代码:
Sitecore.Context.Database.GetItem(((Sublayout)Parent).DataSource);
<强>更新强>
您可以通过使用数据库通过ID获取渲染项本身:
Sitecore.Context.Database.GetItem(((Sublayout)Parent).RenderingID);
答案 1 :(得分:3)
不需要循环控件或通过控件名称检查子布局。
执行任务的正确方法是执行以下步骤:
以下是实现目标的准则:
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具有相同的路径,则会失败。