0

这对于 Sitecore 来说有点奇怪......基本上我正在从 Content API 访问一个项目,但它没有使用基于字段文本的键填充 Item.Fields 哈希表(我想我会称之为字段名称),而是使用 GUID。

例如,这是我用来获取项目的一些代码:

var database = global::Sitecore.Configuration.Factory.GetDatabase("master");
var item = database.GetItem("/sitecore/content/Home");
item.Fields.ReadAll();  // edit, per recommendation... does not work
Sitecore.Data.Fields.Field f = item.Fields["SomeText"];
Assert.IsNotNull(f):  // This fails

如果我设置断点并进行调试,我可以看到 Item.Fields 哈希表中有值(实际上是正确的值),但是键都是基于 GUID 而不是“字段名称”,因为大多数代码示例与使用这个 API 建议。

编辑: 经过仔细检查,DisplayName 和 Name 字段作为空字符串从 API 返回(注意这些在 Sitecore 中明确定义,因此仍然不确定问题是什么)。看起来这些可能与 GUID 一起用作哈希表的某种键。

问题: 我在这里做错了什么吗?我已经发布了数据模板和内容项。显然,正在建立连接,因为我从 API 获取结果,甚至是正确的值,而不是我期望用来引用数据值的键。

参考:

  • http://sdn.sitecore.net/upload/sitecore6/content_api_cookbook-a4.pdf - 查看第 28 页顶部的示例,他们访问“标题”字段。此外,请查看下面 4.1.1“如何访问系统字段”中的直接示例,其中他们使用静态助手和在私有静态构造函数中实例化的 GUID。这是访问“用户定义”字段的首选方法吗?

Sitecore 示例数据的屏幕截图(将 GUID 视为键):

在此处输入图像描述

来自上述链接文档的代码示例:

访问“标题”字段:

Sitecore.Data.Database master = Sitecore.Configuration.Factory.GetDatabase("master");
Sitecore.Data.Items.Item home = master.GetItem("/sitecore/content/home");
Sitecore.Data.Fields.Field titleField = home.Fields["title"];
if(titleField!=null)
{
  home.Editing.BeginEdit();
  titleField.Value = "//TODO: replace with appropriate value";
  home.Editing.EndEdit();
}

访问系统字段“ArchiveDate”:

Sitecore.Data.Database master = Sitecore.Configuration.Factory.GetDatabase("master");
Sitecore.Data.Items.Item sample = master.GetItem("/sitecore/content/home/sample");
Sitecore.Data.Fields.DateField archiveField =
sample.Fields[Sitecore.FieldIDs.ArchiveDate];

反编译 Sitecore.Kernel.dll 我们可以看到:

public static class FieldIDs
{
    // stripped down version

    /// <summary>The ID of the 'Archive date' field.</summary>
    public static ID ArchiveDate;

    static FieldIDs()
    {
        FieldIDs.ArchiveDate = new ID("{56C15C6D-FD5A-40CA-BB37-64CEEC6A9BD5}");
    }
}
4

3 回答 3

4

如果我理解正确,您希望 Fields 集合返回该项目的所有可用字段,即使它们没有值。默认情况下,Sitecore 只会返回那些有值的字段。

ReadAll()您可以通过在访问字段集合之前调用该方法来解决此问题。所以在你的例子中:

item.Fields.ReadAll();
Sitecore.Data.Fields.Field f = item.Fields["SomeText"];
Assert.IsNotNull(f):  // This succeeds
于 2013-03-08T06:56:03.193 回答
3

我有相同症状的问题。对我来说,根本原因是出版问题。包含我的模板的文件夹未发布,尽管模板本身已发布。所以我可以在调试器中看到具有正确值和 id 的字段,但看不到名称。解决方案是确保我的模板的所有父级也都已发布。

于 2014-07-24T12:45:57.733 回答
0

所以,我最终选择了我在问题中提到的路线(这是 Sitecore 内部使用的,@technophoria414 提到,Sitecore 开发人员最佳实践)。

基本上:

namespace MyProject.Core.Data.Sitecore.Fields
{
    public static class ContentItem
    {
        // stripped down version

        public static ID DESCRIPTION_TEXT;

        static ContentItem()
        {
            DESCRIPTION_TEXT= new ID("{56C15C6D-FD5A-40CA-BB37-64CEEC6A9BD5}");  // this will be some GUID out of Sitecore 
        }
    }
}

用法将是这样的:

var query = string.Format("fast:/sitecore/content/HomePageItems//*[@ContentSlug='{0}']", input);
var item = Database.SelectSingleItem(query);
var descriptionText = item.Fields[ContentItem.DESCRIPTION_TEXT].Value;
于 2013-04-03T17:27:56.820 回答