如何通过UDI获取Umbraco Examine搜索结果中的媒体图片URL
解决Umbraco中通过媒体UDI获取URL的问题
嘿,这个场景我太熟悉了!用Examine/Lucene搜索时拿到的媒体字段值往往是UDI格式(就是你看到的umb://media/xxx),要转成可访问的URL其实不难,我来给你拆解步骤,再把你的代码改对:
核心思路
UDI是Umbraco的统一标识符,要转成URL需要两步:
- 把UDI字符串解析成
Udi对象,提取出媒体的Guid - 通过Guid获取对应的媒体节点,再生成可访问的URL
修正后的代码示例
先看针对你现有代码修改后的完整版本(以Umbraco 8为例,后面会补充Umbraco 9+的写法):
foreach (var item in searchResults) { // 注意:如果item.Fields["id"]是内容节点的ID/UDI,用Umbraco.Content没问题;如果是媒体节点,要换成Umbraco.Media var content = Umbraco.Content(item.Fields["id"]); // 用TryGetValue更安全,避免KeyNotFoundException if (item.Fields.TryGetValue("image", out var imageUdiStrings)) { // 分割多个UDI(如果字段允许多选的话) var imageUdiList = imageUdiStrings.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries); foreach (var udiString in imageUdiList) { // 先验证并解析UDI,避免无效字符串报错 if (Udi.TryParse(udiString, out var mediaUdi) && mediaUdi is GuidUdi guidUdi) { // 通过Guid获取媒体节点(Umbraco 8及之前用Umbraco.Media) var mediaItem = Umbraco.Media(guidUdi.Guid); if (mediaItem != null) { // 生成媒体URL,支持指定裁剪别名(可选) var imageUrl = Url.GetMediaUrl(mediaItem); // 如果需要用裁剪图,比如你定义了名为"heroCrop"的裁剪,就这么写: // var imageUrl = Url.GetMediaUrl(mediaItem, "heroCrop"); // 现在你可以使用imageUrl了,比如存到集合里或者直接输出 } } } } }
关键注意点
- 别用
Umbraco.Content拿媒体:内容节点和媒体节点是不同的类型,获取媒体必须用Umbraco.Media(Umbraco 8及之前),用Content会拿到null! - UDI解析要安全:用
Udi.TryParse代替直接Udi.Parse,避免无效UDI字符串导致的异常 - 裁剪URL支持:如果你的媒体设置了图片裁剪,直接在
GetMediaUrl里传裁剪别名就能拿到裁剪后的图片URL
Umbraco 9+(.NET Core)版本适配
如果你用的是Umbraco 9及以后的.NET Core版本,写法会有点不同,因为需要依赖注入相关服务:
首先在类的构造函数注入所需服务:
private readonly IPublishedContentQuery _publishedContentQuery; private readonly IUrlGenerator _urlGenerator; public YourSearchService(IPublishedContentQuery publishedContentQuery, IUrlGenerator urlGenerator) { _publishedContentQuery = publishedContentQuery; _urlGenerator = urlGenerator; }
然后在循环里获取媒体URL:
// ... 前面的循环逻辑不变 ... if (Udi.TryParse(udiString, out var mediaUdi) && mediaUdi is GuidUdi guidUdi) { var mediaItem = _publishedContentQuery.Media(guidUdi.Guid); if (mediaItem != null) { var imageUrl = _urlGenerator.GetMediaUrl(mediaItem); // 使用imageUrl... } }
这样就能完美解决UDI转媒体URL的问题啦!
内容的提问来源于stack exchange,提问作者Paul Thompson
相关产品推荐
相关产品推荐

