I use Razor outside of ASP.NET to create XML documents from a template. I have the following code:
<event> <timeouts trigger='@Model.TriggerTimeout' /> <parameters> @foreach (var parameter in Model.Parameters) { <@parameter.Key>@parameter.Value</@parameter.Key> } </parameters> </event>
where Model.Parameters is just a collection of name / value. My expected result should be:
<event> <timeouts trigger='100' /> <parameters> <name1>value1</name1> <name2>value2</name2> <name3>value3</name3> </parameters> </event>
but I really get:
<event> <timeouts trigger='100' /> <parameters> <name1>value1</@parameter.Key> <name2>value2</@parameter.Key> <name3>value3</@parameter.Key> </parameters> </event>
What am I doing wrong? What is the secret sauce I need to apply to make the dynamic elements close properly?
EDIT So now my model is evolving to have multiple events, and my Razor code looks like this:
<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>
the conclusion should be:
<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>
but actually it is:
<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>
SOLUTION Thanks to a lot of trial and error, I eventually tracked down the missing secret sauce. To open a dynamic XML element, the ?: Prefix is ββrequired to correctly display the closing element. The strangest thing.
<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>