我有下一个代码(就像原型一样)
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() != ""))
我如何获得所有自定义字段的名称? 我应该使用模板数据吗?
答案 0 :(得分:9)
在遍历所有字段之前尝试使用Fields.ReadAll();
:
rootitem.Fields.ReadAll();
foreach (Field fld in rootitem.Fields.Where(d => !d.Shared && !d.Name.StartsWith("__") && d.Name.Trim() != ""))
答案 1 :(得分: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;
}
答案 2 :(得分: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
。