从Umbraco中的文件夹中随机选择图像

时间:2016-12-08 14:52:50

标签: 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 个答案:

答案 0 :(得分: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>
    }
}

如果我们在那里使用它们,我们需要记住将参数添加到宏。 然后,我们可以同时使用媒体 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" />
            }
        }
    }
}

让我知道它是否解决了你的问题:)