0

我开始使用 Sitecore,并且很难让存储在 TreeList 中的图像在 aspnet 中继器中正确显示。

在标记中,我有一个中继器,旨在使用 sc:Image 项列出图像。

                <asp:Repeater ID="rptLogos" runat="server" OnItemDataBound="rptLogos_ItemDataBound" >
                    <ItemTemplate>
                        <a title="Logo" href="#">
                            <sc:Image runat="server" ID="img" field="image logos" />
                        </a>
                    </ItemTemplate>
                </asp:Repeater>

在后面的代码中,我正在检索 MultilistField 并使用 TargetID 设置转发器的数据源,如下所示

        Sitecore.Data.Fields.MultilistField mlLogos = Footer.Fields["Logos"];

        if (mlPartnerLogos != null)
        {
            rptLogos.DataSource = mlLogos.TargetIDs;
            rptLogos.DataBind();
        }

然后在 ItemDataBound 事件中,我将每个 ID 转换为一个项目,从转发器中获取图像控件并为 Sitecore.Web.UI.WebControls.Image 项目设置 Item 字段。

        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            ID targetId = e.Item.DataItem as ID;

            if (!targetId.IsNull)
            {
                MediaItem targetItem = Sitecore.Context.Database.GetItem(targetId);

                if (targetItem != null)
                {
                    var phImage = e.Item.FindControl("img") as Sitecore.Web.UI.WebControls.Image;
                    phImage.Item = targetItem;
                }
            }
        }

如果我调试代码,它似乎可以毫无问题地检索数据。但是,在标记中,我没有翻译成字段,而是得到空白文本。

获取 Sitecore 项目并将其分配给 Sitecore.Web.UI.WebControls.Image 项目的相同“想法”在我有单个项目的其他地方工作正常,尽管我确实注意到如果我更改 sc:Image 标记的字段除了 sitecore 中字段名称的小写名称之外的任何其他内容都不起作用。但是,如果这是问题所在,那么我对 TreeList 中图像的字段名称应该是什么感到有些困惑。

我也有一种奇怪的感觉,我检索项目并尝试分配它们的方式可能有点过于“臃肿”,并且可能有一种更简单的方法。

任何帮助将不胜感激。谢谢你。

编辑:

按照建议通过将 sc:image 替换为 asp:Image 并将 ItemDataBound 更改为

        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            ID targetId = e.Item.DataItem as ID;

            if (!targetId.IsNull)
            {
                MediaItem targetItem = Sitecore.Context.Database.GetItem(targetId);

                if (targetItem != null)
                {
                    var phImage = e.Item.FindControl("img") as System.Web.UI.WebControls.Image;
                    phImage.ImageUrl = Sitecore.Resources.Media.MediaManager.GetMediaUrl(targetItem);
                }
            }
        }
4

2 回答 2

1

sc:image 控件用于显示项目的字段。我认为仅使用 asp:image 控件并填充图像 url 是一种更好的方法。如果您使用 MediaManager,您可以从图像项中获取图像 url。

于 2013-11-20T11:04:42.690 回答
1

马丁是对的。我想补充一点,跳过 OnItemDataBound 更好。你应该使用数据绑定,更容易。将 mlLogos.TargetIDs 替换为项目,您就可以开始了!

于 2013-11-21T08:28:38.067 回答