2011-07-11 94 views
5

在Asp.net MVC中,剃刀插入文本塊之間的額外空間。我想用這種方式呈現一個列表:「1,2,3」,但得到「1,2,3」。ASP.NET MVC剃刀額外渲染的空白

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

是否有任何方法可以刪除多餘的空格?

+0

爲什麼你有後空間第二個''的逗號股份公司? –

+4

[asp.net mvc razor extra space]的可能重複(http:// stackoverflow。com/questions/4282572/asp-net-mvc-razor-extra-space) – StriplingWarrior

回答

6

我想呈現的清單是這樣的: 「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) 
1

不是每次在循環中寫出不同位置的文本位,都可以將所有文本累積在StringBuilder中,然後在循環外部執行@stringBuilderObject.ToString()

+2

這違反了使用頁面模板的全部觀點,因爲它要求將HTML嵌入到字符串文字中。如果你打算這麼做,爲什麼有一個觀點呢?只需在控制器中生成整個頁面即可。 –

+0

@David,我對MVC相當陌生,但我不確定我是否理解你的觀點。他沒有創建任何HTML,只是純文本。 ''元素是專門針對Razor的,它用來表示純文本。 –

+0

瞭解,但它似乎是一個非常簡化的例子。如果不是這樣,對於這樣一個小塊,使用'string'比'StringBuilder'更有效率。此外,查看運行時從視圖中生成的類也許值得您花時間。它處理了很多'StringBuilder'在幕後給你的緩衝。 –

-3

我可能會認爲它不是Razor的問題,而是元素會呈現一些邊緣。

  1. 打開FireBug(或Chrome或其他),看到它確實是標記問題。
  2. 在你的CSS文件中嘗試添加

文本{保證金:0}

+0

顯示的代碼實際上不會爲瀏覽器呈現任何''元素;這只是由Razor用來識別要呈現的文本塊。見Scott Gu的解釋 - http://weblogs.asp.net/scottgu/archive/2010/12/15/asp-net-mvc-3-razor-s-and-lt-text-gt-syntax.aspx –

+0

@格雷厄姆..哎呀,這是理解..謝謝! –

0

問題是與所生成的來源。當你看到實際的源你:

 
    1 
    , 
    2 
    , 
    3 

正如你可以看到有在那裏有很多的空白哪些瀏覽器崩潰到一個單一的空間(看definition for normal)。

使用StringBuilderstring.Join是解決此問題的方法,如果您所做的只是輸出這三個數字。但是,如果您正在嘗試做其他事情,並且這是一個簡化的示例,那麼使用ol/ulli即可獲得see this blog post

6

您所看到的數字和逗號之間的多餘的空格,因爲你的剃鬚刀模板包括數字和逗號之間的換行(其顯示爲空格在瀏覽器中):

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