Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Sitecore-如何使用键的名称(而不是GUID)正确填充Item.Fields哈希表?_C#_.net_Sitecore - Fatal编程技术网

C# Sitecore-如何使用键的名称(而不是GUID)正确填充Item.Fields哈希表?

C# Sitecore-如何使用键的名称(而不是GUID)正确填充Item.Fields哈希表?,c#,.net,sitecore,C#,.net,Sitecore,这对于Sitecore来说有点奇怪。。。基本上,我是从ContentAPI访问一个项,但它没有使用基于字段文本的键(我想我会称之为字段名)填充item.Fields哈希表,而是使用GUID 例如,下面是我用来获取项目的一些代码: var database = global::Sitecore.Configuration.Factory.GetDatabase("master"); var item = database.GetItem("/sitecore/content/Home"); ite

这对于Sitecore来说有点奇怪。。。基本上,我是从ContentAPI访问一个项,但它没有使用基于字段文本的键(我想我会称之为字段名)填充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中得到了结果,甚至是正确的值,而不是我期望用来引用数据值的键

参考资料:

  • -检查第28页顶部的示例,在该页面中,他们可以访问“标题”字段。此外,请查看下面4.1.1“如何访问系统字段”中的示例,在该示例中,他们使用静态助手,并在私有静态构造函数中实例化GUID。这是访问“用户定义”字段的首选方法吗
Sitecore示例数据的屏幕截图(注意将GUI作为键):

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

访问“标题”字段:

访问系统字段“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}");
    }
}
公共静态类字段ID
{
//精简版
///“存档日期”字段的ID。
公共静态ID存档;
静态字段ID()
{
FieldIDs.ArchiveDate=新ID({56C15C6D-FD5A-40CA-BB37-64CEEC6A9BD5});
}
}

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

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

item.Fields.ReadAll();
Sitecore.Data.Fields.Field f = item.Fields["SomeText"];
Assert.IsNotNull(f):  // This succeeds

因此,我最终选择了我在问题中提到的路线(这就是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;

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

我想主要问题是您是在尝试访问系统字段还是其他类型的字段。系统字段由GUID引用。你能确定你的代码中有什么
SomeText
吗?谢谢你的回复。我肯定是想访问“其他类型的字段”,而不是系统字段。例如,假设SomeText是一段文本(字符串),CMS用户(也称为非技术用户)可以在CMS中更新,并将这些更改反映在他们的网站主页上。因此,在item.Fields集合中,Field items上的Name属性是空字符串?@techphoria414是,名称,DisplayName,和类型字段都是空字符串。尝试了新的ID(“{56C15C6D-FD5A-40CA-BB37-64CEEC6A9BD5}”)方法,并且实际有效,这意味着我需要在代码中嵌入数据模板字段的所有GUID。从技术上讲,这是更好的做法。我们通常为字段ID保留一个常量结构。或者你可以用TDS编码。谢谢你的回复。其他人也推荐了它,而且它似乎解决了很多类似的问题,所以在你的工具箱中使用它肯定是一个很好的技巧,但在我的情况下它不起作用。我肯定得到了字段,它们只是没有名称,所以我真的没有关于哪个字段是哪个字段的上下文(因为键是guid)。
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;