【问题标题】:Umbraco - MediaPicker Object Data to JSONUmbraco - MediaPicker 对象数据到 JSON
【发布时间】:2015-08-24 14:29:30
【问题描述】:

在 Umbraco 7 中,是否可以将 mediapicker 序列化为 json?所以它可能是这样的......

[{'name':'muffin', 'file':'muffin.jpg', 'text':'some text', 'etc': 'and so on'}]

我的设置是这样的,我有一个名为“mediaPhotos”的 mediaPicker。包含在 mediaPicker 选择的文件夹中,我有自定义媒体类型“sillyImage”的图像。

我可以创建一个控制器并仅将单个项目查询为 xml。我正在尝试针对 mediapicker 选择的整个图像文件夹并将其内容转换为 json。

我正在尝试使用 bowserm 在下面发布的解决方案,其工作原理如下......

它使用 mediaPicker 别名动态获取 CurrentPage。然后它通过了自定义媒体类型。

 public class MediaApiController : UmbracoApiController
 {
     [HttpGet]
     public MediaApiModel GetMediaById(string id)
     {
    var media = Umbraco.TypedMedia(id);

    return new MediaApiModel
    {
        MediaId = media.Id,
        MediaUrl = media.Url
    };
}
    [HttpGet]
    public IEnumerable<MediaApiModel> GetMediaObj(string mediaAlias)
    {
        var currentPage = Umbraco.TypedContent(UmbracoContext.Current.PageId);
        var mediaRootId = currentPage.GetPropertyValue<string>("mediaPhotos");
        var mediaRoot = Umbraco.TypedMedia(mediaRootId);
        var media = mediaRoot.Children.Where(m => m.IsDocumentType(mediaTypeAlias));
        return media.Select(m => new MediaApiModel
        {
            MediaId = m.Id,
            MediaUrl = m.Url
        });
    }
 }



var uri3 = '//' + document.domain + ':14712' + '/umbraco/api/MediaApi/GetMediaFolder?mediaAlias=sillyImage';
        $(document).ready(function () {
            $.getJSON(uri3)
                .done(function (data) {
                    console.log('return json data object ' + data);
                });
        });

我现在收到 500 错误,所以它越来越近了。我认为问题在于控制器中的这些行

 var currentPage = Umbraco.TypedContent(UmbracoContext.Current.PageId);
        var mediaRootId = currentPage.GetPropertyValue<string>("mediaPhotos");
        var mediaRoot = Umbraco.TypedMedia(mediaRootId);

我的页面使用页面名称,因此我不确定 PageId 是根本问题。我知道的一项是 GetPropertyValue 无法从当前页面获取媒体选择器对象。

谢谢!

【问题讨论】:

    标签: json xml umbraco


    【解决方案1】:

    您应该能够让您的 Api 控制器自动将结果序列化为 JSON。只需从 UmbracoApiController 继承即可。

    public class MediaApiController : UmbracoApiController
    {
        [HttpGet]
        public MediaApiModel GetMediaById(string id)
        {
            var media = Umbraco.TypedMedia(id);
    
            return new MediaApiModel
            {
                MediaId = media.Id,
                MediaUrl = media.Url
            };
        }
    
        [HttpPost]
        public IEnumerable<MediaApiModel> GetMediaObj(string mediaTypeAlias)
        {
            var currentPage = Umbraco.TypedContent(UmbracoContext.Current.PageId);
            var mediaRootId = currentPage.GetPropertyValue<string>("mediaPhotos");
            var mediaRoot = Umbraco.TypedMedia(mediaRootId);
            var media = mediaRoot.Children.Where(m => m.IsDocumentType(mediaTypeAlias));
            return media.Select(m => new MediaApiModel
            {
                MediaId = m.Id,
                MediaUrl = m.Url
            });
        }
    

    【讨论】:

    • 感谢 bowserm,它看起来正确,但我无法弄清楚语法错误 返回的最后一行给了我一个错误,说它“需要一个 } 或 )”并且在结尾处return 它在类、敲击或接口成员声明中给出错误“无效令牌”
    • 糟糕。我刚刚编辑了我的答案。 GetMediaObj 模型应该返回 MediaApiModels 的 IEnumerable,如果您想获取所有这些模型。此外,我还有其他一些语法错误。立即尝试。
    • 我尝试了上面的示例,但无法让它返回任何内容。我会得到一个 404 试图调用“GetMediaObj”方法。我知道我可以使用第一种方法“GetMediaById”来访问控制器;效果很好。我还尝试在别名中对自定义媒体类型进行硬编码,但仍然没有。
    • 糟糕。我刚刚将 GetMediaObj 方法上的 [HttpGet] 属性更改为 [HttpPost] 因为您试图在 $.ajax 调用中发布。立即尝试。
    • 我还是卡住了。我必须遗漏其他内容,无论是我发布的内容还是该方法如何收集其依赖项。
    猜你喜欢
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 2015-06-22
    • 2014-04-26
    • 2020-03-31
    相关资源
    最近更新 更多