【问题标题】:ASP.NET MVC Razor extra whitespace renderedASP.NET MVC Razor 呈现额外的空白
【发布时间】:2011-07-11 15:25:56
【问题描述】:

在 Asp.net MVC 中,Razor 在文本块之间插入额外的空间。我想以这种方式呈现一个列表:“1, 2, 3”,但得到“1, 2, 3”。

@for (int i = 1; i < 3; i++)
{
  <text>@i</text>
  if (i != 2)
  {
    <text>, </text>
  }
}

有什么办法可以去掉多余的空格?

【问题讨论】:

标签: asp.net-mvc razor


【解决方案1】:

我想这样渲染一个列表:“1, 2, 3”

又快又脏:

@string.Join(", ", Enumerable.Range(1, 3))

显然,自定义助手似乎更适合在视图中格式化某些内容:

public static class HtmlExtensions
{
    public static IHtmlString FormatList(this HtmlHelper html, IEnumerable<int> list)
    {
        return MvcHtmlString.Create(string.Join(", ", list));
    }
}

然后简单地说:

@Html.FormatList(Model.MyList)

【讨论】:

    【解决方案2】:

    您看到数字和逗号之间有多余的空格,因为您的剃须刀模板在数字和逗号之间包含换行符(在浏览器中显示为空格):

    @for (int i = 1; i < 3; i++)
    {
      <text>@i</text> >LINE BREAK HERE<
      if (i != 2)
      {
        <text>, </text>
      }
    }
    

    我喜欢Darin's answer,我建议删除循环并用更具声明性的语句替换它,但如果你不想走那么远,请尝试至少删除换行符:

    @for (int i = 1; i < 3; i++)
    {
        <text>@i</text>if (i != 2){<text>, </text>}
    }
    

    【讨论】:

    • 为什么&lt;/text&gt; 后面的字符有输出?换行符不应该被视为 C# 代码吗?
    • @NetMage 我不知道为什么......我只是分享我的观察结果。我不再使用太多 Razor,所以据我所知,这甚至可能不是当前的行为(这个答案来自近 7 年前)。
    【解决方案3】:

    您可以将所有文本累积在StringBuilder 中,然后在循环之外执行@stringBuilderObject.ToString(),而不是每次在循环中写出不同位置的文本。

    【讨论】:

    • 这违反了使用页面模板的全部要点,因为它需要将 HTML 嵌入字符串文字中。如果你要那样做,为什么还要有视图呢?只需在控制器中生成整个页面。
    • @David,我对 MVC 很陌生,但我不确定我是否理解你的观点。他没有创建任何 HTML,只是纯文本。 &lt;text&gt; 元素是 Razor 特有的,用于表示纯文本。
    • 明白了,不过好像这是一个大大简化的例子。如果不是这样,对于这么小的块,使用string 将比StringBuilder 更有效。此外,可能值得您花时间查看运行时从视图中生成的类。它负责StringBuilder 在幕后为您提供的大量缓冲。
    • @David,好的,但是在正常的 .Net 中,如果您通过循环一次构建一个字符串,StringBuilder 通常是一个好方法。您是说 Razor 视图的编译方式意味着仅附加到字符串(使用 +=?)就足够了?
    • 是的,你说得对,通过正常连接构建字符串可能非常非常慢,因为每次添加字符串都会创建一个副本(以及相关的垃圾收集)。然而,编译后的视图不是这样工作的。在这种情况下,我什至不会使用string += - 让 Razor 像他一样处理它。在我看来,将 HTML 保留在视图中而不是编译的代码是必需的 - 当设计人员想要添加或删除逗号时,我不应该更改代码。
    【解决方案4】:

    问题在于生成的源。当您查看实际来源时:

    1 , 2 , 3

    如您所见,其中有很多空白区域,浏览器会折叠成一个空格(查看definition for normal)。

    如果您所做的只是输出这三个数字,则使用StringBuilderstring.Join 是解决此问题的方法。但是,如果您正在尝试做其他事情并且这是一个简化的示例,那么see this blog post 可以使用ol/ullis 来实现它。

    【讨论】:

      【解决方案5】:

      我可能认为这不是 Razor 的问题,而是元素渲染时带有一些边距。

      1. 打开 FireBug(或 Chrome 或其他),看看它确实是标记问题。
      2. 在你的css文件中尝试添加

      文本{边距:0}

      【讨论】: