使用 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);
不确定是否需要该类型,但这对我有用。
使用 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);
不确定是否需要该类型,但这对我有用。