3

我有下一个代码(就像原型一样)

 private void WriteDataToItems(Item rootitem, IQueryable<LanguageData> languageData, SC.Globalization.Language sclng)
        {
            if (rootitem == null)
                return;
            rootitem = IncVersion(rootitem);
            Response.Write(string.Format("Item {0} - {1}<br/>", rootitem.DisplayName, rootitem.Paths.FullPath));
            rootitem.Editing.BeginEdit();
            try
            {
                foreach (Field fld in rootitem.Fields.Where(d => !d.Shared && !d.Name.StartsWith("__") && d.Name.Trim() != ""))
                {
                    Response.Write(string.Format("Processing  fld: - {0}<br/>", fld.ID.Guid.ToString()));
                    var data = languageData.FirstOrDefault(
                            d => (string.Compare(d.FieldName, fld.Name, true) == 0) && (string.Compare(d.ItemID, rootitem.ID.Guid.ToString(), true) == 0));
                    if (data != null)
                    {
                        string newValue = null;
                        switch (sclng.Name)
                        {
                            case "en":
                                newValue = data.En;
                                break;
                            case "nn-NO":
                                newValue = data.nnNO;
                                break;
                            case "sv-SE":
                                newValue = data.svSE;
                                break;
                            case "da-DK":
                                newValue = data.DaDK;
                                break;
                            case "de-DE":
                                newValue = data.deDE;
                                break;
                            default:
                                newValue = null;
                                break;
                        }

                        if (newValue != null)
                        {
                            Response.Write(string.Format("Save field with Id:{0} New Value:{1}<br/>", fld.ID.Guid, newValue));
                            fld.Value = newValue;
                        }
                    }

                }

                rootitem.Editing.EndEdit();
            }
            catch (Exception ex)
            {
                rootitem.Editing.CancelEdit();

            }

            foreach (Item cd in rootitem.GetChildren())
            {
                WriteDataToItems(cd, languageData, sclng);
            }

        }

以及rootitem.Fields对象不包含模板中描述的所有字段的问题,我只是有一个文件,它只包含具有某些值但不包含具有空数据的字段的字段

foreach (Field fld in rootitem.Fields.Where(d => !d.Shared && !d.Name.StartsWith("__") && d.Name.Trim() != ""))

如何获取所有自定义字段名称?我应该使用模板数据吗?

4

3 回答 3

11

Fields.ReadAll();在遍历所有字段之前尝试使用:

rootitem.Fields.ReadAll();
foreach (Field fld in rootitem.Fields.Where(d => !d.Shared && !d.Name.StartsWith("__") && d.Name.Trim() != ""))
于 2013-06-27T07:12:01.757 回答
3

使用后,Fields.ReadAll()您可以通过方法释放这些字段使用的内存item.Fields.Reset();

这是和的ReadAll()代码Reset()

 /// <summary>
/// Reads all.
/// 
/// </summary>
public void ReadAll()
{
  Template template = TemplateManager.GetTemplate(this._ownerItem);
  if (template == null)
    return;
  TemplateField[] fields = template.GetFields();
  this._fields = new Field[fields.Length];
  for (int index = 0; index < fields.Length; ++index)
    this._fields[index] = new Field(fields[index].ID, this._ownerItem);
}

/// <summary>
/// Resets this instance.
/// 
/// </summary>
public void Reset()
{
  this._fields = (Field[]) null;
  this._innerFields = (FieldList) null;
}
于 2013-06-28T08:28:10.377 回答
3

出于性能考虑,Sitecore 不会为您提供FieldCollection以下代码中的所有字段,仅提供项目级别具有显式值的字段,包括空字符串。

但是,您将能够使用Sitecore.Context.Item.Fields["title"]或使用启用 PageEditor 的 Web 控件(例如 sc:text)访问字段:<sc:text field="title" runat="server" />

为了拥有 FieldCollection 中的所有字段并遍历它们,请确保您的代码将Sitecore.Data.Items.Item.Fields.ReadAll()foreach.

于 2015-09-09T02:33:21.927 回答