Загрузка нескольких изображений из древовидного списка в sitecore
Я начинаю работать с 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 я преобразовываю каждый идентификатор в элемент, извлекаю элемент управления изображением из повторителя и устанавливаю поле "Элемент" для элемента Sitecore.Web.UI.WebControls.Image.
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: изображение 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);
}
}
}
2 ответа
Элемент управления sc:image должен использоваться для отображения полей элемента. Я думаю, что лучше всего использовать элемент управления asp:image и заполнить URL-адрес изображения. Если вы используете MediaManager, вы можете получить URL-адрес изображения из вашего элемента изображения.
Мартейн прав. Я хотел бы добавить, что пропуск OnItemDataBound лучше. Вы должны использовать привязку данных, гораздо проще. Замените mlLogos.TargetID на элементы, и все готово!