【发布时间】:2013-02-08 07:54:07
【问题描述】:
我在 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>
【问题讨论】:
-
我已经尝试重新创建这个场景,它在一个普通的
.cshtml文件中对我来说工作正常。你用什么来解析剃刀文件? -
你试过
@:</@(_event.Name)>吗? -
另外,有趣的是,您在 MVC 之外使用 Razor。你考虑过Runtime-T4
-
我确实尝试过,但出现以下错误:“:”在代码块的开头无效。只有标识符、关键字、cmets、"(" 和 "{" 是有效的。
-
@KirkWoll 我正在使用 RazorEngine (razorengine.codeplex.com)。我们将 Razor 用于我们的 ASP.NET MVC 应用程序。