Library.GetMediaById Umbraco返回奇怪的字符串

时间:2016-02-20 19:00:11

标签: css asp.net umbraco7

我正在尝试从宏观上在我的Umbraco上的旋转木马中显示图像,我正在使用Library.GetMediaById(child.picture)。这是我的代码:

        @foreach (var child in slider.Children.Where("Visible"))
        {
            var background = Library.MediaById(child.picture);

            if (i == 0)
            {
                <div id="@i" class="item active" data-id="@i" style="background-image: url(@background.UmbracoFile)">

                </div>
            }
            else
            {
                <div id="@i" class="item" data-id="@i" style="background-image: url(@background.UmbracoFile)">

                </div>
            }

        i++;
        }

然而,当我这样做而不是像我一样<div id="1" class="item" data-id="1" style="background-image: url('/media/1007/slide-2.png')"></div>时,我应该得到一堆额外的东西:

<div id="1" class="item" data-id="1" style="background-image: url({src: '/media/1007/slide-2.png', crops: []})"></div>

我如何才能获得该媒体项目的网址,而不是所有额外的内容?

BTW我正在使用Umbraco 7.4

2 个答案:

答案 0 :(得分:1)

如果您使用的是Umbraco 7或更高版本,我强烈建议您使用新的API来检索属性值和内容或媒体节点,而不是使用现已过时的Library.MediaById方法。

如果您更喜欢动态视图模型,可以使用DynamicPublishedContent API,它允许您使用@CurrentPage模型编写动态查询。所以你的例子是:

@foreach (var child in CurrentPage.AncestorOrSelf(1).Children.Where("isVisible"))
{
    var backgroundPicture = Umbraco.Media(child.Picture); //assuming an image property on child
     var backgroundPictureUrl = picture.Url;
     // your markup here
}

如果您更喜欢强类型模型,则可以使用IPublishedContent API。请注意,您的观点必须继承适当的类型,例如Umbraco.Web.Mvc.UmbracoTemplatePage

@foreach (var child in Model.AncestorOrSelf(1).Children().Where(c => c.IsVisible))
{
     var backgroundPicture = Umbraco.TypedMedia(child.GetPropertyValue<int>("picture");
     var backgroupdPictureUrl = backgroundPicture.Url;
     // your markup here
}

此外,从您的示例中我怀疑您可能正在使用图像裁剪器属性来存储背景图像,在这种情况下,该属性将具有json(JObject)值而不是与媒体对应的int同上

在这种情况下,需要调整检索图片属性的代码,查看documentation for image cropper以查看获取图片网址的不同方式,具体取决于您是否已指定作物和/或焦点。例如,如果您使用动态API并且您只对图片网址感兴趣,请使用以下内容:

<div style="background-image: url('@child.picture.src')">

答案 1 :(得分:0)

所以我解决这个问题的方法是,部分代替宏,因为partials继承了Umbraco.Web.Mvc.UmbracoTemplatePage,所以我可以使用Umbraco.Media()代替。以下是工作代码,以防有人遇到此问题并需要帮助:

@inherits Umbraco.Web.Mvc.UmbracoTemplatePage

@{

 var root = Model.Content.AncestorOrSelf(1);

 int i = 0;
}


<div class="container">
  <div id="photo-carousel" class="carousel slide">
    <div class="carousel-inner">
        @foreach (var child in root.Children().Where("naviHide == true"))
        {
            if (child.DocumentTypeAlias.Equals("slider"))
            {
                foreach (var picture in child.Children.Where("naviHide != true"))
                {
                    var background = Umbraco.Media(picture.GetPropertyValue("picture"));

                    if (i == 0)
                    {
                        <div id="@i" class="item active" data-id="@i" style="background-image: url('@background.Url')">

                        </div>
                    }
                    else
                    {
                        <div id="@i" class="item" data-id="@i" style="background-image: url('@background.Url')">

                        </div>
                    }
                    i++;
                }
            }

        }
    </div>

    <a class="carousel-control left" href="#photo-carousel" data-slide="prev">
        <span class="glyphicon glyphicon-chevron-left"></span>
    </a>
    <a class="carousel-control right" href="#photo-carousel" data-slide="next">
        <span class="glyphicon glyphicon-chevron-right"></span>
    </a>
   </div>
  </div>