Asp.net mvc ASP.NET MVC Razor渲染的额外空白
在Asp.NETMVC中,Razor在文本块之间插入额外的空间。我想这样呈现一个列表:“1,2,3”,但得到“1,2,3” (int i=1;i<3;i++) { @我 如果(i!=2) { , } }Asp.net mvc ASP.NET MVC Razor渲染的额外空白,asp.net-mvc,razor,Asp.net Mvc,Razor,在Asp.NETMVC中,Razor在文本块之间插入额外的空间。我想这样呈现一个列表:“1,2,3”,但得到“1,2,3” (int i=1;i
有什么方法可以删除多余的空白吗?不必在循环中每次都在不同的位置写出文本,您可以将所有文本累积到
StringBuilder
中,然后在循环外执行@stringBuilderObject.ToString()
我可以假定这不是Razor的问题,而是用一些边距渲染元素
@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));
}
}
问题在于生成的源。当您查看实际来源时,您会得到: 1 , 2 , 3 1. , 2. , 3. 正如您所看到的,浏览器中有大量的空白,这些空白被压缩成一个单独的空间(请看下图)
如果只输出这三个数字,那么使用
StringBuilder
或string.Join
就是解决这个问题的方法。但是,如果您正在尝试做其他事情,这是一个简化的示例,那么使用ol/ul
和li
s执行此操作的方法。您会看到数字和逗号之间有额外的空白,因为您的razor模板包含一个换行符(在浏览器中显示为空白)在数字和逗号之间:
@for (int i = 1; i < 3; i++)
{
<text>@i</text> >LINE BREAK HERE<
if (i != 2)
{
<text>, </text>
}
}
(int i=1;i<3;i++)
{
@我在这里换行<
如果(i!=2)
{
,
}
}
我喜欢,我建议删除循环并用更具声明性的语句替换它,但如果不想走那么远,请至少尝试删除换行符:
@for (int i = 1; i < 3; i++)
{
<text>@i</text>if (i != 2){<text>, </text>}
}
(int i=1;i<3;i++)
{
@iif(i!=2){,}
}
这违反了使用页面模板的全部要点,因为它需要将HTML嵌入字符串文本中。如果你要这么做,为什么还要看呢?只需在控制器中生成整个页面。@David,我对MVC相当陌生,但我不确定我是否理解您的观点。他没有创建任何HTML,只是创建纯文本。
元素是Razor特有的,用于表示纯文本。理解,但这似乎是一个大大简化的示例。如果不是,那么对于这样一个小的块,使用字符串
将比使用StringBuilder
更有效。此外,您可能值得花时间查看运行时从视图生成的类。它处理了StringBuilder
在幕后为您提供的大量缓冲。@David,好的,但在正常的.Net中,如果您通过循环一次构建一个字符串,那么StringBuilder
通常是一个不错的方法。你是说Razor视图的编译方式意味着仅仅附加到字符串(使用+=
?)就足够了吗?是的,你是对的,通过正常连接构建字符串可能非常非常慢,因为每次添加字符串都会创建一个副本(以及相关的垃圾收集)。然而,编译视图不是这样工作的。在这种情况下,我甚至不会使用string+=
——只要让Razor像他那样处理它就行了。在我看来,将HTML保留在视图中,不包含在已编译的代码中是必需的-当设计师想要添加或删除逗号时,我不必进行代码更改。为什么在第二个
标记中的逗号后有空格?显示的代码的可能副本实际上不会向浏览器呈现任何
元素;Razor只是使用它来识别要渲染的文本块。参见Scott Gu的解释-为什么
后面的任何字符都会得到输出?换行符不应该被认为是C代码吗?@NetMage我不知道为什么。。。我只是分享我的观察结果。我不再使用太多剃须刀了,所以据我所知,这甚至可能不是现在的行为(这个答案是近7年前的)。
@for (int i = 1; i < 3; i++)
{
<text>@i</text> >LINE BREAK HERE<
if (i != 2)
{
<text>, </text>
}
}
@for (int i = 1; i < 3; i++)
{
<text>@i</text>if (i != 2){<text>, </text>}
}