使用 Sitecore 和 FakeDB,如何设置 LookupField TargetItem?

With Sitecore and FakeDB, how can you set a LookupField TargetItem?

使用 FakeDB,如何在 DbLinkField 中设置 TargetItem 的值?

设置: 我有一个数据模板,其中包含一个指向其他项目列表的下拉列表。

我有一个 Sitecore 项目扩展方法:

public static Item Lookup(this Item item, string fieldName)
{
    if (item == null) throw new ArgumentNullException("item");
    LookupField field = item.Fields[fieldName];
    if (field == null) return null;
    return field.TargetItem;
}

单元测试和结果: 当我 运行 针对我的代码进行以下简单测试时,LookupItem 被发现为一个字段,但生成的 LookupItem 具有空 TargetItem。是否可以使用 FakeDB 以某种方式模拟它?

[Test]
public void TestLookupItemExtension()
{
    ID templateId = ID.NewID;
    ID refItemId = ID.NewID;

    using (var db = new Db()
    {
        new DbTemplate("ItemTpl", templateId) { "Foo" },
        new DbItem("RefItem", refItemId),
        new DbItem("ItemComponent", ID.NewID, templateId)
        {
            new DbLinkField("Foo") { TargetID = refItemId  }
        }
    })
    {
        var item = db.GetItem("/sitecore/content/itemcomponent");
        var lookupItem = item.Lookup("Foo");
        lookupItem.Should().NotBeNull();
    }
}

targetitem 中字段的结果如下所示:

field   {Sitecore.Data.Fields.LookupField}  Sitecore.Data.Fields.LookupField
+       InnerField  "Foo"-{{C906FD3D-C5DA-4191-8F0A-F15603FB897E}}  Sitecore.Data.Fields.Field
+       TargetID    {{00000000-0000-0000-0000-000000000000}}    Sitecore.Data.ID
+       TargetItem  null    Sitecore.Data.Items.Item
        Value   "<link />"  string
+       _innerField "Foo"-{{C906FD3D-C5DA-4191-8F0A-F15603FB897E}}  Sitecore.Data.Fields.Field

所以我得到的 LookupField 是正确的,但实际上从未将 TargetId 或 TargetItem 放入生成的 LookupField 模拟对象中。

如有任何想法,我们将不胜感激。

If (item == null) 抛出新参数。

你试过了吗?

if (!empty($item)) {}

也许在进入查找字段之前将您的长 ifs 更改为更简单的变量。

这里可以用js做异步文件调用吗?它来自 json 数据吗?

我认为问题在于您混合使用了 LinkField 和 LookupField。 在您的测试中,您应该将 "Foo" 定义为 LookupField。像这样:

var field = new DbField("Foo") { Type = "Lookup" };
field.Value = refItemId.ToString();
var dbItem = new DbItem("ItemComponent", ID.NewID, templateId)
                     {
                        field
                     };
db.Add(dbItem);

不确定是否需要该类型,但这对我有用。