Generieren von dynamischem XML in Razor
Ich verwende Razor außerhalb von ASP.NET, um XML-Dokumente aus einer Vorlage zu generieren. Ich habe folgenden Code:
<event>
<timeouts trigger='@Model.TriggerTimeout' />
<parameters>
@foreach (var parameter in Model.Parameters) {
<@parameter.Key>@parameter.Value</@parameter.Key>
}
</parameters>
</event>
Dabei ist Model.Parameters nur eine Name / Wert-Auflistung. Meine erwartete Ausgabe sollte sein:
<event>
<timeouts trigger='100' />
<parameters>
<name1>value1</name1>
<name2>value2</name2>
<name3>value3</name3>
</parameters>
</event>
aber was ich eigentlich bekomme ist:
<event>
<timeouts trigger='100' />
<parameters>
<name1>value1</@parameter.Key>
<name2>value2</@parameter.Key>
<name3>value3</@parameter.Key>
</parameters>
</event>
Was mache ich falsch? Was ist die geheime Sauce, die ich anwenden muss, um die dynamischen Elemente richtig zu schließen?
BEARBEITEN Mein Modell hat nun mehrere Ereignisse und mein Razor-Code sieht folgendermaßen aus:
<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>
Die Ausgabe sollte sein:
<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>
aber es ist tatsächlich:
<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>
LÖSUNG Durch einMenge Von Versuch und Irrtum aus habe ich schließlich die fehlende geheime Soße aufgespürt. Das öffnende dynamische XML-Element benötigte a?:
Präfix, um das schließende Element korrekt zu rendern. Am seltsamsten.
<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>