2012-02-02 2 views
5

Я сейчас сражаюсь с добавлением элементов через C# в базу данных Sitecore.Как программно заполнять элементы Sitecore (Добавить элемент и поля)?

Код ниже выполняется правильно, однако элементы не создаются.

Кроме того, я заметил, что элемент ["FieldName"] = значение; синтаксис фактически не заполняет коллекцию Fields.

И коллекция полей по элементу кажется только для чтения, поэтому я не могу просто позвонить. Добавить на нее (такой метод не существует).

Итак - каков правильный способ создания дочернего элемента и заполнения его полей?

Я использую базу данных Master как для бэкэнд Sitecore, так и для этого кода.

код я использую ниже:

using (new Sitecore.SecurityModel.SecurityDisabler()) 
    { 

     Database db = Factory.GetDatabase(this.Database); 

     foreach (var vacancy in Articles.Tables[0].Rows) 
     { 
      var rootItem = db.GetItem(this.RootItem); 
      DataRow dr = (DataRow) vacancy; 

      var newItem = rootItem.Add(string.Format("{0} {1}", dr["numericID"], dr["job_name"]), 
             db.GetTemplate(new ID("{GUID}"))); 

      newItem.Editing.BeginEdit(); 
      newItem["Job Title"] = dr["job_name"].ToString();// 
      newItem.Editing.EndEdit(); 
     } 
} 

Подробнее: newItem.Template.Fields возвращает коллекцию с 100 полей

newItem.Fields возвращает FieldCollection только с 9 элементов в нем.

Когда я передаю код newItem ["field"]. Значение = значение; он не увеличивает счет коллекции newItem.Fields.

Конечно, поле «поле» соответствует тем, которые присутствуют в newItem.Template.Fields [x] .Name.

ответ

5

1) Проверьте некоторые вещи первый f.ex:

Ассинг шаблон к переменной и проверить, что вы получите там. и лучше не делать это ID, а по пути:

var templateItem = db.GetTemplate("yourTemplatePath"); 

Теперь проверить, является ли это шаблон вы хотите? убедитесь, что он опубликовал (он всегда может вызвать некоторые несоответствия)

2) Что касается полей, не являющихся «видимыми», вы пробовали: item.Fields.ReadAll()

3) Что вы имеете в виду под «элементы не создается «? как бы вы это проверить?

4) Также - вы уверены, что this.Database == "master"?

+0

2) Да, это помогло предварительно заполнить коллекцию Fields, я дам вам знать, как я лажу. –

+0

3) Я не видел их в редакторе содержимого Sitecore при использовании базы данных Master. –

+0

4) Да ......... –

2

Я хотел бы предложить установить значение поля в

newItem.Fields["Job Title"].Value = dr["job_name"].ToString();// 

Все остальное выглядит нормально.

+0

Спасибо, я попробую сейчас –

+0

, если «job_name» разрешает нулевые значения, вам нужно проверить, не имеет ли значение значение null перед преобразованием в строку. –

+0

Возможно, стоит упомянуть, что вы можете использовать сокращенный newItem ["Job Title"] = "whatever" – geedubb

4

Я рекомендовал бы два изменения:

(1) Элемент именования подход:

var newItem = rootItem.Add(ItemUtil.ProposeValidItemName(string.Format("{0} {1}", dr["numericID"], dr["job_name"])), db.GetTemplate(new ID("{GUID}"))); 

Это изменение будет обрабатывать недопустимые символы в предлагаемом имени с другого источника данных.

(2) Поле Значение параметра подход:

newItem.Fields["Job Title"].Value = dr["job_name"].ToString(); 

Это установит сырое значение поля в переданной строке.

+0

Спасибо. Что произойдет, если я назначу недопустимые значения (например, текстовую строку в поле Integer)? Получаю ли я хорошее исключение из базового кода Sitecore или просто (как в моем случае) никакой записи не произойдет? –

+0

Поля всегда содержат строковые значения –

+0

Спасибо за умное предложение ProposeValidName, я тоже этого не видел, однако это не было проблемой в этом случае. Я могу только отметить один ответ как «принятый» :( –

Смежные вопросы