2010-11-26 78 views
27

剃刀插入文本块之间的额外空间。我想用这种方式呈现一个列表:“1,2,3”,但得到“1,2,3”。asp.net mvc剃须刀额外空间

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

有没有什么方法可以去除这个额外的空间?

回答

16

您可以使用@ Html.Raw。代码是更具可读性和输出没有多余空格

@for (int i = 1; i < 3; i++) 
{ 
    @Html.Raw(i) 
    if (i != 2) 
    { 
    @Html.Raw(", ") 
    } 
} 
+0

Html.Raw在帮助器中不起作用,因为这可以看到下面的答案。 – Case 2012-07-24 19:48:08

+0

@Case提到的答案可能是[Chris Toman的答案]的解决方案#4(http://stackoverflow.com/a/7237191/2615878)。 – Theophilus 2015-01-05 14:58:16

10

相信在ASP.NET Razor RC中存在一个问题,不幸的是,它将把“代码上下文”中的空白视为写入响应的文字空白空间。

上面的例子是通过去除码块内的空白“固定”:

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

或者更整洁:

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

通过遵循该thread on the asp.net站点有其具有的讨论类似的问题和安德鲁护士的回应

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

所以如果这同样的问题,希望它使列表被修复。

这个错误并没有使RTM

6

我可能会写这样一个自定义的助手:

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

,然后在我看来,使用它:

@Html.RenderNumbers(3); 
19

由于这仍然是MVC 3 RTM +工具更新中的<text>标记的问题,因此它可以是b e真正令人头疼的是,eddiegroves将代码格式中的空格删除的方法的替代方法是避免使用<text>标签。

首先,这里是能重现问题的原代码的重写和实际打印“1,2,3”:

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

这里有四种选择打印“1,2,3”,而不是的“1,2,3”,但通过使用@something而不是<text>保留代码格式。

溶液#1:使用@( “”)

@for (int i = 1; i <= 3; i++) { 
    @i 
    if (i < 3) { 
     @(", ") 
    } 
} 

溶液#2:使用@var

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

溶液#3:使用@(表达式)

@for (int i = 1; i <= 3; i++) { 
    @i @(i < 3 ? ", " : null) 
} 

解决方案#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) 
} 

对于这个例子来说,最后一个显然是矫枉过正的,但对于更复杂的项目和分隔符可能是一个有用的模式。

0

下列任何一项应该工作,这取决于您的价值观实际上是从哪里来的:

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

我想删除所有在一些研究后,我的解决方案如下,在HTML中额外的空间。

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

包住<文本>或<标签> {}中,

可以在辅助函数使用,并将其与“格式文档”功能很好地工作。

请确认您输入的代码块,如果不换为@ {}

代码的某些元素(HTML,头部,身体),你需要{<标签> @ {} @ ** @ </tag>}

防止使用“格式文档”功能后的换行添加。

@{ 
    {<!DOCTYPE html>} 
    {<html>@{ 
     {<head>@{ 
     {<link .../>} 
     }@**@</head>} 
     {<body>@{ 
     {<div>@{ 
      {<hr/>} 
     }</div>} 
     }@**@</body>} 
    }@**@</html>} 
} 

@model object 
@{ 
    // init 
}@{ 

}@section MainSection {@{ 
    {<div>@{ 
     {<hr/>} 
     {@Html.Partial("abc")} 
     Html.RenderPartial("abc"); 
     if ("razor" == "good") 
     { 
     for (var i = 1; i <= 10; i++) 
     { 
      Write("("); 
      {@i} 
      Write(" "); 
      {@<text>)</text>} 
     } 
     } 
    }</div>} 
}} 

希望它有帮助。