2016-12-08 2 views
0

Я создал папку в 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. 

Спасибо за любые help

+0

Какую версию Umbraco вы используете? – BeaverProj

+0

Я использую версию 7 – KingOfKong

+0

Похоже, вы используете старый DynamicNode Razor api из v4. – BeaverProj

ответ

2

Вы можете взглянуть и ознакомиться с образцами макрочастичных изображений, предварительно установленными на каждом веб-сайте 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.

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

@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" /> 
      } 
     } 
    } 
} 

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

+0

спасибо большое, отличный ответ – KingOfKong