Случайный выбор изображения из папки в Umbraco

Я создал папку в Umbraco, и я хотел бы отобразить случайное изображение из этой папки на моей странице.

Я нашел решение несколько лет назад, которое давало мне ошибки компиляции

dynamic folder = Library.MediaById(1054);
var randomImage = folder.Children.Where("nodeTypeAlias = \"Image\"").Random();

Я обнаружил, что мне нужно добавить правильные наследники в мой файл

 @using umbraco.MacroEngines
 @inherits DynamicNodeContext 

но это дает мне ошибку, потому что у меня уже есть @model, который я использую в первой строке

The 'inherits' keyword is not allowed when a 'model' keyword is used.

Спасибо за любую помощь

1 ответ

Решение

Вы можете взглянуть и изучить пример макропробивного представления, предварительно установленного на каждом веб-сайте Umbraco. Существует фрагмент под названием " Список изображений из папки мультимедиа".

Код фрагмента по умолчанию выглядит следующим образом:

@inherits Umbraco.Web.Macros.PartialViewMacroPage


@*
    Macro to display a series of images from a media folder.

    How it works:
        - Confirm the macro parameter has been passed in with a value
        - Loop through all the media Id's passed in (might be a single item, might be many)
        - Display any individual images, as well as any folders of images

    Macro Parameters To Create, for this macro to work:
    Alias:mediaId     Name:Select folder with images    Type:Single Media Picker
*@

@{ var mediaId = Model.MacroParameters["mediaId"]; }
@if (mediaId != null)
{
    @* Get all the media item associated with the id passed in *@
    var media = Umbraco.Media(mediaId);
    var selection = media.Children("Image");

    if (selection.Any())
    {
        <ul>
            @foreach (var item in selection)
            {
                <li>
                    <img src="@item.umbracoFile" alt="@item.Name" />
                </li>
            }
        </ul>
    }
}

Нам нужно не забыть добавить параметр в макрос, если мы используем их там. Затем мы можем использовать оба: Media или вспомогательные методы TypedMedia для извлечения папки (которая является типичным элементом мультимедиа другого типа), несмотря на требуемый возвращаемый тип. Я обычно использую TypedMedia, чтобы иметь возможность работать со строго типизированным объектом и просматривать свойства в Visual Studio.

Если мы правильно создадим макрос и вставим его в шаблон, используя такой код (с правильным идентификатором папки):

@Umbraco.RenderMacro("Test", new { mediaId="1082" })

мы должны увидеть список изображений из этой папки (все они в данный момент).

Финальная часть почти такая же, как вы делали это ранее, но нам нужно немного ее скорректировать. Мой окончательный код и предложение ниже:

@inherits Umbraco.Web.Macros.PartialViewMacroPage

@{ 
    var folderId = Model.MacroParameters["mediaId"];
    if (folderId != null)
    {
        var media = Umbraco.TypedMedia(folderId);
        var rand = new Random();
        var imagesInFolder = media.Children("Image");

        if(imagesInFolder.Any()) {
            var pick = imagesInFolder.ElementAt(rand.Next(0, imagesInFolder.Count()));
            if (pick != null)
            {
                <img src="@pick.GetCropUrl()" alt="@pick.Name" />
            }
        }
    }
}

Дайте мне знать, если это решило вашу проблему:)

Другие вопросы по тегам