2013-06-27 79 views
3

我有一個代碼(就像原型)Sitecore項目不包含所有字段,爲什麼?

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() != "")) 

如何獲取所有自定義字段的名稱? 我應該使用模板數據嗎?

回答

9

試圖通過各個領域的循環之前使用Fields.ReadAll();

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

只是出於好奇:什麼ReadAll()做?這個函數是否讀取了不可見的字段? –

+1

@ RG-3:ReadAll()將獲取該項目的模板,在其上調用「GetFields」,然後迭代這些字段,將每個字段添加到FieldCollection對象的專用_fields []數組中。 –

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; 
} 
3

爲了表現,Sitecore不會提供e以下代碼中的FieldCollection中的所有字段都只包含項目級別顯式值的字段,包括空字符串。

但是,您將能夠與任何Sitecore.Context.Item.Fields["title"]或用PageEditor啓用Web控制如SC訪問字段:文本:<sc:text field="title" runat="server" />

爲了能在FieldCollection所有字段並遍歷它們,使確保您的代碼將包括Sitecore.Data.Items.Item.Fields.ReadAll()在您的foreach之前致電。

相關問題