【问题标题】:Sitecore - Get the field names of an itemSitecore - 获取项目的字段名称
【发布时间】:2026-01-22 03:25:01
【问题描述】:

我想获取一个项目的字段名称列表,但无法正常工作。

这是我目前的尝试:

if (pathItemInLanguage.Versions.GetVersions().Length == 0)
                        {
                            Item newItemLangVersion = pathItemInLanguage.Versions.AddVersion();

                            //Populate the new language version with values:
                            newItemLangVersion.Editing.BeginEdit();

                            newItemLangVersion.Fields.ReadAll();
                            foreach (Field field in newItemLangVersion.Fields)
                            {
                                string dn = "nix";
                                dn = field.DisplayName;
                                string n = "nix";
                                n = field.Name;
                                string k = "nix";
                                k = field.Key;
                                string xy = "nix";
                                xy = field.ToString();

                                if ((FieldTypeManager.GetField(Sitecore.Context.Item.Fields[field.DisplayName]) is HtmlField) ||
                                    (FieldTypeManager.GetField(Sitecore.Context.Item.Fields[field.DisplayName]) is TextField))
                                {
                                    newItemLangVersion.Fields[field.Name].Value = "new";
                                }
                            }
                            newItemLangVersion.Editing.EndEdit();

我从字段中读取的那些字符串都没有给出项目的实际字段名称。该应用程序在 Sitecore 桌面内作为模块运行。

我错过了什么?

【问题讨论】:

  • 您是否尝试使用 (new Sitecore.SecurityModel.SecurityDisabler()) 添加?
  • 否,但将实际字段名作为字符串传递,例如 newItemLangVersion.Fields["Title"].Value = "new";作品。安全性仍然是问题吗?
  • 是的,可能是个问题。请在调试模式下检查您的 Sitecore.Context.UserName 是什么?并检查您对要编辑的项目拥有哪些权限
  • 就这么做了。用户是 sitecore\admin,这是意料之中的,因为应用程序从 Sitecore 桌面作为模块运行。
  • field.Namefield.Key 的值是多少?它们是空的吗?里面有什么吗?

标签: types sitecore field


【解决方案1】:

我更新了我的答案。您需要按以下方式进行操作:检查该字段是否为标准模板字段并检查该字段的类型:

请这样做:

   if (pathItemInLanguage.Versions.GetVersions().Length == 0)
     {
        Item newItemLangVersion =  pathItemInLanguage.Versions.AddVersion();
        //Populate the new language version with values:
         //Populate the new language version with values:
        newItemLangVersion.Editing.BeginEdit();

        newItemLangVersion.Fields.ReadAll();

        foreach (Field field in newItemLangVersion.Fields)
        {
            if (!IsStandardTemplateField(field) && (field is HtmlField || field is TextField))
            newItemLangVersion.Fields[field.Name].Value = "new";
        }
        newItemLangVersion.Editing.EndEdit();
      }

你有一个方法来检查是否是一个模板字段,因为你不需要修改那种字段

  public bool IsStandardTemplateField(
       Field field)
    {
        Sitecore.Data.Templates.Template template = Sitecore.Data.Managers.TemplateManager.GetTemplate(
          Sitecore.Configuration.Settings.DefaultBaseTemplate,
          field.Database);
        Sitecore.Diagnostics.Assert.IsNotNull(template, "template");
        return template.ContainsField(field.ID);
    }

【讨论】:

  • 这对我不起作用,因为我有很多不同领域的不同项目。我需要一个通用的方法来做到这一点。
  • 我想遍历项目,为系统/语言下的所有语言创建版本,并使用虚拟文本填充文本字段和 HTML 字段。所有语言的项目版本创建已经工作,但我无法将虚拟文本放入项目中。困难的部分是项目基于不同的模板,因此它们具有不同的字段类型和字段名称。
  • 试了一下,但新版本中仍然没有文字。 Visual Studio 会发出警告,即条件字段是 HtmlField,而另一个则永远不会满足。 "警告 1:给定的表达式永远不是提供的 ('Sitecore.Data.Fields.HtmlField') 类型"
【解决方案2】:

使用它来工作:

if ((FieldTypeManager.GetField(field) is HtmlField) || (FieldTypeManager.GetField(field) is TextField)) {
...
}

【讨论】:

  • 标准模板字段会发生什么?你在更新它们吗? :)
  • 我不确定你的意思。你能解释一下吗?
  • 当你运行 newItemLangVersion.Fields.ReadAll(); foreach(newItemLangVersion.Fields 中的字段字段){ 正在解析所有 Sitecore 字段,包括诸如“__Renderings、__Boosting Rules 等站点核心标准字段,如果是文本字段或 Html 字段类型,则更新此字段
  • 哦,我明白了。我会遇到问题,因为这是我实际做的:newItemLangVersion.Fields[field.Name].Value = defaultLangItem.Fields[field.Name].ToString();