2012-07-17 7 views
6

イベントハンドラを使用してコンポーネントのフィールド値をオーバーライドするにはどうすればよいですか?以下のコードスニペットがある場合、コンポーネントの保存中にエラーは発生しません。しかし、Event hanlderによって行われたコンテンツの変更はコンポーネントに反映されません。私は単一の値フィールド "サイズ"が値として "blabla ..."を持つことを期待しています。イベントハンドラを使用したSDL Tridionコンポーネントのコンテンツのオーバーライド

次のようにあなたは、XML文字列でContentプロパティを更新する必要があり
// Call to Subscribe the events 
EventSystem.Subscribe<Component, SaveEventArgs>(ComponentSaveInitiatedHandler, 
               EventPhases.Initiated); 

private void ComponentSaveInitiatedHandler(Component component, 
              SaveEventArgs args, EventPhases phases) 
{ 
    if (component.Schema.Title == "XYZ") 
    { 
     ItemFields Fields = new ItemFields(component.Content, component.Schema); 
     SingleLineTextField textField = (SingleLineTextField)Fields["size"]; 
     textField.Value = "blabla..."; 
    } 
} 

答えて

9

ItemFields Fields = new ItemFields(component.Content, component.Schema); 
SingleLineTextField textField = (SingleLineTextField)Fields["size"]; 
textField.Value = "blabla..."; 
component.Content = Fields.ToXml(); 
+2

ItemFieldsコレクションはそうそこに変更を行う、いわゆる一戸建てコレクションですので、この理由は、コンポーネントを直接更新しません。 –

+0

レガシーAPIでは、デタッチされたコレクションで作業し、それを使用して関連するコレクションプロパティを 'parent'オブジェクトに再度設定することができます。これは、コアサービスを使用する同等のアプローチのようです。 –

+1

もしあなたがTOMを意味するならば、私はフィールドコレクションが切り離されたとは思わない。 'Component.Fields( "heading")のようなものです。Value(1)= "Test":Component.Save(True)'はうまくいくでしょう。ああ、黄金時代.. – Quirijn

関連する問題