2011-07-11 24 views
5

En Asp.net MVC, Razor inserta espacio adicional entre los bloques de texto. Quiero hacer una lista de esta manera: "1, 2, 3", pero obtener "1, 2, 3".ASP.NET MVC Razor espacios en blanco adicionales representados

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

¿Hay alguna forma de eliminar el espacio en blanco adicional?

+0

¿Por qué tiene un espacio después? la coma en el segundo '' t ag? –

+4

posible duplicado de [asp.net mvc razor space extra] (http: // stackoverflow.com/questions/4282572/asp-net-mvc-razor-extra-space) – StriplingWarrior

Respuesta

6

Quiero hacer una lista de esta manera: "1, 2, 3"

rápida y sucia:

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

Obviamente un ayudante costumbre parece más apropiado a la tarea de dar formato a algo en la vista:

public static class HtmlExtensions 
{ 
    public static IHtmlString FormatList(this HtmlHelper html, IEnumerable<int> list) 
    { 
     return MvcHtmlString.Create(string.Join(", ", list)); 
    } 
} 

y luego simplemente:

@Html.FormatList(Model.MyList) 
1

En lugar de escribir bits de texto en diferentes lugares cada vez que pasa el ciclo, puede acumular todo el texto en un StringBuilder, luego fuera del ciclo hacer @stringBuilderObject.ToString().

+2

Eso viola el objetivo de usar plantillas de página, ya que requiere incrustar el HTML en cadenas literales. Si vas a hacer eso, ¿por qué tener una vista? Simplemente genere toda la página en el controlador. –

+0

@David, soy bastante nuevo en MVC, pero no estoy seguro de entender tu punto. Él no está creando ningún HTML, solo texto sin formato. El elemento '' es específico de Razor, se usa para indicar texto sin formato. –

+0

Entendido, pero parece que este es un ejemplo muy simplificado. Si no es así, usar 'cadena' sería más eficiente que un' StringBuilder' para un bloque tan pequeño. Además, podría valer la pena ver la clase que el tiempo de ejecución genera desde la vista. Se ocupa mucho del almacenamiento en búfer que 'StringBuilder' te ofrece detrás de las escenas. –

-3

Podría suponer que no es un problema de Razor, sino que el elemento se representa con algunas marcas.

  1. Abra FireBug (o Chrome o lo que sea) y vea que realmente es un problema de marcado.
  2. En ti CSS archivo intenta agregar

texto {margin: 0}

+0

El código que se muestra no representará ningún elemento '' en el navegador; esto es utilizado por Razor para reconocer bloques de texto para renderizar. Consulte la explicación de Scott Gu: http://weblogs.asp.net/scottgu/archive/2010/12/15/asp-net-mvc-3-razor-s-and-lt-text-gt-syntax.aspx –

+0

@ Graham ... oops, se entiende ... ¡gracias! –

0

El problema es con la fuente que se genera. Cuando nos fijamos en la fuente real que se obtiene:

 
    1 
    , 
    2 
    , 
    3 

Como se puede ver que hay una gran cantidad de espacio en blanco en la que hay navegadores colapso a un solo espacio (mirar el definition for normal).

El uso de un StringBuilder o string.Join es la manera de solucionar esto si todo lo que hace es sacar estos tres números. Pero si está tratando de hacer otra cosa y este es un ejemplo simplificado, entonces see this blog post para una forma de hacerlo usando ol/ul y li s.

6

Usted está viendo el espacio en blanco extra entre el número y la coma debido a que su plantilla de maquinilla de afeitar incluye un salto de línea (que se muestra como un espacio en blanco en el navegador) entre el número y la coma:

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

me gusta Darin's answer , y yo sugeriría eliminar su bucle y reemplazarlo con una declaración más declarativa, pero si no quiere ir tan lejos, intente al menos eliminar el salto de línea:

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