ASP.NETの外部でRazorを使用して、テンプレートからXMLドキュメントを生成しています。私は次のコードを持っています:
<event>
<timeouts trigger='@Model.TriggerTimeout' />
<parameters>
@foreach (var parameter in Model.Parameters) {
<@parameter.Key>@parameter.Value</@parameter.Key>
}
</parameters>
</event>
ここで、Model.Parametersは単なる名前/値のコレクションです。私の期待する出力は次のようになります。
<event>
<timeouts trigger='100' />
<parameters>
<name1>value1</name1>
<name2>value2</name2>
<name3>value3</name3>
</parameters>
</event>
しかし、私が実際に得ているのは次のとおりです。
<event>
<timeouts trigger='100' />
<parameters>
<name1>value1</@parameter.Key>
<name2>value2</@parameter.Key>
<name3>value3</@parameter.Key>
</parameters>
</event>
私は何が間違っているのですか?ダイナミックな要素を適切に閉じるために適用する必要がある秘密のソースは何ですか?
編集 これで、モデルが進化して複数のイベントが発生し、Razorコードは次のようになります。
<events>
@foreach (var _event in Model.Events) {
<@_event.Name enabled='@_event.Enabled'>
<timeouts trigger='@_event.TriggerTimeout' />
<parameters>
@foreach (var parameter in _event.Parameters) {
@:<@parameter.Key>@parameter.Value</@(parameter.Key)>
}
</parameters>
</@_event.Name>
}
</events>
出力は次のようになります。
<events>
<event1 enabled='true'>
<timeouts trigger='100' />
<parameters>
<name1>value1</name1>
<name2>value2</name2>
</parameters>
</event1>
<event2 enabled='false'>
<timeouts trigger='100' />
<parameters>
<name1>value1</name1>
</parameters>
</event2>
</events>
しかし、実際には次のとおりです。
<events>
<event1 enabled='true'>
<timeouts trigger='100' />
<parameters>
<name1>value1</name1>
<name2>value2</name2>
</parameters>
</@_event.Name>
<event2 enabled='false'>
<timeouts trigger='100' />
<parameters>
<name1>value1</name1>
</parameters>
</@_event.Name>
</events>
解決策
多くの試行錯誤の末、私は最終的に不足している秘密のソースを突き止めました。開始動的XML要素?:
には、終了要素を正しくレンダリングするためのプレフィックスが必要でした。最も奇妙な。
<events>
@foreach (var _event in Model.Events) {
@:<@_event.Name enabled='@_event.Enabled'>
<timeouts trigger='@_event.TriggerTimeout' />
<parameters>
@foreach (var parameter in _event.Parameters) {
@:<@parameter.Key>@parameter.Value</@(parameter.Key)>
}
</parameters>
</@_event.Name>
}
</events>