Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ASP.NET MVC Razor渲染的额外空白_Asp.net Mvc_Razor - Fatal编程技术网

Asp.net mvc ASP.NET MVC Razor渲染的额外空白

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

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

(int i=1;i<3;i++) { @我 如果(i!=2) { , } }
有什么方法可以删除多余的空白吗?

不必在循环中每次都在不同的位置写出文本,您可以将所有文本累积到
StringBuilder
中,然后在循环外执行
@stringBuilderObject.ToString()
我可以假定这不是Razor的问题,而是用一些边距渲染元素

  • 打开FireBug(或Chrome或其他什么),看看它是否真的是标记问题
  • 在您的css文件中尝试添加
  • 文本{边距:0}

    我想这样呈现一个列表:“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));
        }
    }
    

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

    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>}
    }