2010-11-26 18 views
27

Razor fügt zusätzlichen Platz zwischen Textblöcken ein. Ich möchte eine Liste auf diese Weise rendern: "1, 2, 3", aber "1, 2, 3" erhalten.asp.net mvc razor extra space

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

Gibt es Möglichkeiten, diesen zusätzlichen Speicherplatz zu entfernen?

Antwort

16

Sie könnten @ Html.Raw verwenden. Der Code ist besser lesbar und der Ausgang nicht zusätzliche Leerzeichen hat

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

Html.Raw funktioniert nicht innerhalb von Helfern, dafür die folgende Antwort. – Case

+0

Die Antwort, auf die sich @Case bezieht, ist wahrscheinlich die Lösung # 4 von [Chris Toman's Antwort] (http://stackoverflow.com/a/7237191/2615878). – Theophilus

10

I glaube,, dass es ein Problem in der ASP.NET Razor RC gibt, die leider Whitespace innerhalb der "Code-Kontext" als literal Leerzeichen behandelt, um auf die Antwort zu schreiben.

Das obige Beispiel ist „fixiert“ durch den Leerraum innerhalb der Codeblöcke zu entfernen:

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

Oder mehr ordentlich:

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

Folgt man diese thread on the asp.net Website gibt es eine Diskussion, die eine hat ähnliches Problem und Andrew Krankenschwester antwortet

Dieser Fehler wurde protokolliert und wirdseinfür RTM berücksichtigt. So

wenn diese ist das gleiche Problem, hoffentlich hat er die Liste festgelegt werden.

Dieser Fehler hat noch keinen RTM machen

6

Ich würde wahrscheinlich einen benutzerdefinierten Helfer für dieses schreiben:

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

und es dann meiner Meinung nach verwenden:

@Html.RenderNumbers(3); 
19

Da dies immer noch ein Problem mit dem <text> Tag in MVC 3 RTM + Tools Update und es kann b e eine echte Kopfschmerzen zu bewältigen, ist eine Alternative zu Eddiegroves Ansatz zum Entfernen von Leerzeichen aus der Code-Formatierung ist die Verwendung der <text> Tag insgesamt zu vermeiden.

Als erstes ist hier ein Umschreiben des ursprünglichen Code, der das Problem reproduziert und tatsächlich druckt "1, 2, 3":

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

Hier sind vier Alternativen, die "1, 2, 3" statt drucken von "1, 2, 3", aber bewahren Sie die Codeformatierung mit @something anstelle von <text>.

Lösung # 1: Verwendung @ ("")

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

Lösung # 2: Verwendung von

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

Lösung # @var 3: Verwenden @ (expression)

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

Lösung # 4: Verwenden von @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) 
} 

Die letzte ist offensichtlich übertrieben für das Beispiel, könnte aber ein nützliches Muster für kompliziertere Elemente und Separatoren sein.

0

Jede der folgenden sollte funktionieren, je nachdem, wo Sie Ihre Werte von den tatsächlich kommen:

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

ich all das zu entfernende extra platz in html, nach einigem forschen, meine lösung wie folgt.

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

wickeln Sie Ihren < text> oder < tag> in {},

du in Helferfunktion verwenden können, und es funktioniert gut mit "Document Format" Funktion.

Stellen Sie sicher, Codeblock eingegeben haben, wenn sie nicht den Code mit @ wickeln {}

für einige Elemente (html, Kopf, Körper), müssen Sie {< tag> @ {} @ ** @ </tag>}

zu verhindern Newline hinzufügen nach Verwendung der Funktion "Format Document".

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

hoffe es hilft.

+1

Großartig! Das funktioniert tatsächlich – Luke