我有一个问题,从 Umbraco V7 升级到 V8 后,我的相关链接丢失了。我看到当我获取信息时,它们仍然存在于响应中,但我在仪表板中看不到它们。更新之前,数据类型为“RelatedLinks”,更新后,数据类型为“Multi Url Picker”
Umbraco v8 上的相关链接数据类型已更改为多 URL 选择器。您的第一步应该是检查这是否是配置或数据问题。
要检查这是否是数据问题,您可以使用相同的文档类型(和数据类型)创建一个新页面。如果没有显示任何错误,那么它一定与数据有关。
如果是数据错误,那么您可以尝试寻找解决方案来更新或创建数据。
如果您没有很多页面出现此问题,您可能需要考虑手动创建/更新出现此问题的内容页面。另一种选择是检查数据库以找出丢失的位并通过一些脚本更新数据。
最终方法可能是尝试通过创建 ValueConverter 来解决数据问题,类似于此:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Umbraco.Cms.Core.Models.PublishedContent;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.PropertyEditors.ValueConverters;
using Umbraco.Cms.Core.PublishedCache;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Core.Web;
namespace AnUmbracoV10ProjectName.Configurator.Core.Util
{
public class IntUdiMultiNodeTreePickerValueConverter : MultiNodeTreePickerValueConverter
{
private readonly IPublishedSnapshotAccessor _publishedSnapshotAccessor;
public IntUdiMultiNodeTreePickerValueConverter(IPublishedSnapshotAccessor publishedSnapshotAccessor, IUmbracoContextAccessor umbracoContextAccessor, IMemberService memberService) : base(publishedSnapshotAccessor, umbracoContextAccessor, memberService)
{
_publishedSnapshotAccessor = publishedSnapshotAccessor;
}
public override object? ConvertSourceToIntermediate(IPublishedElement owner, IPublishedPropertyType propertyType, object? source, bool preview)
{
if (source == null)
{
return null;
}
if (propertyType.EditorAlias.Equals(Umbraco.Cms.Core.Constants.PropertyEditors.Aliases.MultiNodeTreePicker))
{
Udi?[]? nodeIds = source.ToString()?
.Split(Umbraco.Cms.Core.Constants.CharArrays.Comma, StringSplitOptions.RemoveEmptyEntries)
.Select(ParseUdiOrInt)
.ToArray();
return nodeIds;
}
return null;
}
protected Udi? ParseUdiOrInt(string id)
{
if (UdiParser.TryParse(id, out var udi))
{
return udi;
}
if (Int32.TryParse(id, out var integer))
{
if (_publishedSnapshotAccessor.TryGetPublishedSnapshot(out var publishedSnapshot))
{
var item = publishedSnapshot?.Media?.GetById(integer);
if (item is not null)
{
return new GuidUdi(Umbraco.Cms.Core.Constants.UdiEntityType.Media, item.Key);
}
}
}
return null;
}
}
}