asp.net mvc razor额外的空间

Sib*_*Guy 29 .net c# 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>
  }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法删除这个额外的空间?

小智 20

由于<text>MVC 3 RTM +工具更新中的标签仍然存在问题并且处理起来非常麻烦,因此eddiegroves从代码格式中删除空格的方法的替代方法是完全避免使用<text>标签.

首先,这里是重写原始代码,重现问题并实际打印"1,2,3":

    @for (int i = 1; i <= 3; i++) {
      @i
      if (i < 3) {
        <text>, </text>
      }
    }
Run Code Online (Sandbox Code Playgroud)

以下是打印"1,2,3"而不是"1,2,3"的四种替代方法,但使用@something代替而保留代码格式<text>.

解决方案#1:使用@("")

@for (int i = 1; i <= 3; i++) {
    @i
    if (i < 3) {
        @(", ")
    }
}
Run Code Online (Sandbox Code Playgroud)

解决方案#2:使用@var

@for (int i = 1; i <= 3; i++) {
    var s = i < 3 ? ", " : null;
    @i @s
}
Run Code Online (Sandbox Code Playgroud)

解决方案#3:使用@(表达式)

@for (int i = 1; i <= 3; i++) {
    @i @(i < 3 ? ", " : null)
}
Run Code Online (Sandbox Code Playgroud)

解决方案#4:使用@helpers

@helper Item(int index) {
    @index
}

@helper Separator(int index, int count) {
    if (index < count) {
        @(", ")
    }
}

@for (int i = 1; i <= 3; i++) {
    @Item(i) @Separator(i, 3)
}
Run Code Online (Sandbox Code Playgroud)

对于该示例而言,最后一个显然是过度的,但对于更复杂的项和分隔符可能是有用的模式.


Ada*_*gen 18

你可以使用@ Html.Raw.代码更易读,输出没有额外的空格

@for (int i = 1; i < 3; i++)
{
  @Html.Raw(i)
  if (i != 2)
  {
    @Html.Raw(", ")
  }
}
Run Code Online (Sandbox Code Playgroud)


edd*_*ves 10

相信 ASP.NET Razor RC中存在一个问题,遗憾的是它会将"代码上下文"中的空白视为文字空格来写入响应.

通过删除代码块内的空格来"修复"上面的示例:

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

或者更整洁:

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

通过在asp.net网站关注这个帖子,有一个讨论有类似的问题,Andrew Nurse回应

此错误已被记录,将被考虑用于RTM.

因此,如果这同一个问题,希望它能够修复列表.

这个bug没有成为RTM


Dar*_*rov 7

我可能会为此写一个自定义助手:

public static MvcHtmlString RenderNumbers(this HtmlHelper htmlHelper, int count)
{
    var text = string.Join(", ", Enumerable.Range(1, count).ToArray());
    return MvcHtmlString.Create(text);
}
Run Code Online (Sandbox Code Playgroud)

然后在我的视图中使用它:

@Html.RenderNumbers(3);
Run Code Online (Sandbox Code Playgroud)