4

我在 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>
4

1 回答 1

4

你需要写信</@(parameter.Key)>阻止 Razor 认为那是一个电子邮件地址。

于 2013-02-07T01:06:05.000 回答