Create dynamic XML in Razor

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> 
+4
source share
1 answer

You need to write </@(parameter.Key)> to stop Razor from thinking that this is an email address.

+4
source

All Articles