【问题标题】:Generating dynamic XML in Razor在 Razor 中生成动态 XML
【发布时间】: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 文件中对我来说工作正常。你用什么来解析剃刀文件?
  • 你试过@:&lt;/@(_event.Name)&gt; 吗?
  • 另外,有趣的是,您在 MVC 之外使用 Razor。你考虑过Runtime-T4
  • 我确实尝试过,但出现以下错误:“:”在代码块的开头无效。只有标识符、关键字、cmets、"(" 和 "{" 是有效的。
  • @KirkWoll 我正在使用 RazorEngine (razorengine.codeplex.com)。我们将 Razor 用于我们的 ASP.NET MVC 应用程序。

标签: c# xml razor


【解决方案1】:

您需要写 &lt;/@(parameter.Key)&gt; 以阻止 Razor 认为这是一个电子邮件地址。

【讨论】:

  • 不幸的是,这只给了我 value1@(parameter.Key)> 的输出
  • @DavidKeaveny:尝试在行首添加@:
  • 我也尝试过 @{parameter.Key}>,但这给了我 value1@{parameter.Key}> 的输出。看起来 正在阻止 Razor 解析最后一个值。我也试过把它分成多行也没有成功。
  • 啊,解决了我的那部分问题。
  • 我终于找到了我的代码中有问题的部分 - 元素,虽然它为自己生成了正确的代码行,但仍然需要 @: 作为前缀,以便结束标签也将被写入。 非常烦人,但感谢您为我指明了正确的方向。我将使用最终的工作解决方案更新问题。
猜你喜欢
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 2013-01-07
  • 2013-07-20
  • 2014-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多