【问题标题】:Razor template is not rendering as expectedRazor 模板未按预期呈现
【发布时间】:2014-08-27 20:02:59
【问题描述】:

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

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

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

渲染元素助手:

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

我发现每个循环都有两个问题

  • 所有项目都放在输出中的同一行
  • RenderElement 的输出正在被 html 编码

对于第一个问题,是否存在强制剃须刀呈现新行的公认方法? 让我重申一下,我不会用这把剃须刀输出 html。所以&lt;br&gt;标签不是一个选项。

我可以通过将 RenderElement 调用包装在对 @Html.Raw() 的调用中来解决第二个问题,但这感觉很混乱,所以理想情况下,我想了解为什么首先要对其进行编码以及是否存在防止这种情况发生的更清洁的方法。

【问题讨论】:

  • 如果我不得不像你那样做坏事(我知道你知道),我可能会使用 DisplayFor 和自定义模板。
  • @cheesemacfly 不是一个坏主意,但添加显示模板只会使本已极其复杂的应用程序更加复杂。所以我宁愿在某个地方的 Environment.Newline 中使用@Html.Raw 和蛮力。
  • 好吧,它添加了一个元素,但至少显示的一半不是在方法内部生成,而是在部分视图中生成,因此可以轻松更改。话虽如此,如果您选择使用扩展方法,我认为@Html.Raw() 是您唯一的选择。

标签: asp.net-mvc razor


【解决方案1】:

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

对于问题 1,尝试在每个节点后使用 &lt;br/&gt;。

问题1,由于不是html输出(抱歉!)..查看How to insert newline in string literal?的解决方案

使用 \n 或 Environment.Newline。

【讨论】:

  • 是的,它正在对值进行编码,但我认为不应该在字符串中对包含它的文本进行编码是不正确的。格式化 arg 1 的值正在被显式编码,但是不知何故,整个格式字符串正在被编码。对于问题一,这不是 html 输出。
【解决方案2】:

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

问题 #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: 我没有解释为什么我的解决方案有效,我最多只能说它使 razor 将输出视为一条线(如果有人可以对此提供技术解释,那就太好了)

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

【讨论】:

  • 这很奇怪,因为即使 HtmlString 对象也是 html 编码的(请参阅 msdn.microsoft.com/en-us/library/… 和 msdn.microsoft.com/en-us/library/…)
  • @cheesemacfly 不,这是有道理的,通过调用ToHtmlString(),您告诉它对字符串进行编码,因此从那里它不会尝试再次对其进行编码,而我只是在创建一个 HtmlString。
猜你喜欢
  • 1970-01-01
  • 2012-11-28
  • 2017-02-23
  • 2018-10-01
  • 2014-09-29
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
相关资源
最近更新 更多