2012-02-02 20 views
5

私は現在、SitecoreデータベースにC#経由でアイテムを追加して戦っています。Sitecoreアイテムをプログラムで作成する方法(アイテムとフィールドを追加する)?

以下のコードは正しく実行されますが、アイテムは作成されていません。

また、項目["FieldName"] = value;構文では実際にFieldsコレクションにデータが格納されません。

アイテムのFieldsコレクションは読み込み専用なので、その上に.Addを呼び出すことはできません(そのようなメソッドは存在しません)。

だから、子アイテムを作成してそのフィールドに移入する正しい方法は何ですか?

私は、Sitecoreバックエンドとこのコードの両方にMasterデータベースを使用しています。

私は以下の使用コード:

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でコレクションを返すことで唯一の9つの要素を持つFieldCollectionを返します。

私はコード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)Masterデータベースを使用している場合、Sitecore Content Editorで表示されませんでした。 –

+0

4)はい......... –

2

私は他の

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

すべてがOKに見えるよう、フィールドの値を設定することをお勧め。

+0

ありがとう、私は今それを試します –

+0

"job_name"がnull値を許可する場合は、文字列に変換する前に、値がnullでないかどうかを確認する必要があります。 –

+0

おそらく、あなたはnewItem ["Job Title"] = "whatever"という略記を使うことができると言及する価値があります。 – geedubb

4

は、私は2つの変更をお勧めします:

(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(); 

この指定された文字列にフィールドの生の値を設定します。変数にテンプレートをASSING

、あなたがそこに着くかどうか確認する:

+0

ありがとうございます。無効な値(例:Integerフィールドにテキスト文字列など)を割り当てた場合、どうなりますか?私はSitecoreの基本コードから素晴らしい例外を受け取るか、まったく(私の場合のように)書き込みは起こりませんか? –

+0

フィールドには常に文字列の値が含まれています –

+0

ProposeValidNameの賢明な提案をありがとう、私はそれも欠けていましたが、これはこの場合問題ではありませんでした。 ( –