Razor模板未按预期呈现

时间:2014-08-27 20:02:59

标签: asp.net-mvc razor

我正在使用一个Restful应用程序,它使用mvc和razor返回xml(让我们跳过这是一个坏主意)

我在部分视图中有一个foreach,它根据项目生成xml节点:

@foreach (var item in Model)
{
   @Html.RenderElement(item.Type.ToString(), item.Value)
}

RenderElement Helper:

    public static string RenderElement(this HtmlHelper helper, string elementName, object elementValue)
    {
        return string.Format("<{0}>{1}</{0}>", elementName, helper.Encode(elementValue));
    }

我看到每个循环有两个问题

  • 这些项目都放在输出中的同一行
  • RenderElement的输出是html编码的

对于第一个问题是否有一种可以接受的强制剃刀渲染新线的方法? 让我重申一下,我不是用这把剃须刀输出html。因此,<br>标记不是一个选项。

我可以通过在调用@ Html.Raw()时包装RenderElement调用来修复第二个问题,但这感觉很乱,所以理想情况下我想理解为什么它首先被编码并且如果有的话更清洁的方法来防止这种情况。

2 个答案:

答案 0 :(得分:0)

问题2的原因是HtmlHelper.Encode函数HTML对值进行编码。 http://msdn.microsoft.com/en-us/library/system.web.mvc.htmlhelper.encode(v=vs.118).aspx

对于问题1,请尝试在每个节点后使用<br/>

问题1,因为它不是html输出(抱歉!)..检查解决方案How to insert newline in string literal?

使用\ n或Environment.Newline。

答案 1 :(得分:0)

在经过一些随机的戳之后,我想出了解决这两个问题的方法。

问题#1:  这里的问题是因为RenderElement返回一个字符串,razor隐式编码整个字符串,修复是返回一个IHtmlString。

public static IHtmlString RenderElement(this HtmlHelper helper, string elementName, object elementValue)
{
    return new HtmlString(string.Format("<{0}>{1}</{0}>", elementName, helper.Encode(elementValue)));
}

问题#2:  我没有解释为什么我的解决方案有效,我能说的最多就是剃刀将输出视为一条线(如果有人可以提供技术解释,这将是非常棒的)

@foreach (var item in Model)
{
    <text>@Html.RenderElement(item.Type.ToString(), item.Value)</text>
}