2012-07-04 9 views
8

He migrado de mvc 3 a mvc 4 y me encontré con el siguiente problema.Primera línea vacía en razor mvc 4 rc

@using InvoiceDocflow.Controllers 
@{ 
    Response.ContentType = "text/xml"; 
} 
<?xml version="1.1" encoding="UTF-8" ?> 
<dc> 
    @foreach (var dcLink in (IEnumerable<DcLink>)ViewData["SupportedDcs"]) 
    { 
     <link rel="@dcLink.RelUri.ToString()" href="@dcLink.DcUri.ToString()" /> 
    } 
</dc> 

Esta es mi opinión. Mi diseño es sólo una línea

@RenderBody() 

Así que en MVC 3 <?xml version="1.1" encoding="UTF-8" ?> apareció en la primera línea, pero ahora, sus aparece en la segunda línea, dejando XX primera línea vacía.

enter image description here

¿Puedo hacer que rinde en la primera línea como lo fue en MVC 3?

Por cierto.

@using InvoiceDocflow.Controllers 
@{ 
    Response.ContentType = "text/xml"; 
}<?xml version="1.1" encoding="UTF-8" ?> 

Esto funcionaría, pero esto no es lo que quiero hacer en absoluto.

+0

No veo nada bsd en el comportamiento de Mvc4: copia en la página todos los retornos de carro que están fuera de un bloque de código, por lo que si no quiere que el carro retorne debe poner

+0

No necesito el bloque de código para influir implícitamente en la salida. Simplemente está mal. Estuvo bien en MVC 3. –

+0

El punto es que el retorno de carro está fuera del bloque de código por lo que se informa en el outpunt. Mientras que Vb está orientado a la línea, C# no lo es. Es evidente que el Mvc 4 toma una definición diferente de bloque de código que Mvc3 ... pero no creo que se pueda decir que la definición de Mvc 4 "es incorrecta" ... simplemente diferente. –

Respuesta

6

¿Solución temporal? ActionFilter y quita la primera línea vacía? Claramente, también podrías hacer otra minimización en la respuesta si es adecuado.

public class TranslationFilter : MemoryStream 
{ 
    private Stream filter = null; 

    public TranslationFilter(HttpResponseBase httpResponseBase) 
    { 
     filter = httpResponseBase.Filter; 
    } 

    public override void Write(byte[] buffer, int offset, int count) 
    { 
     var response = UTF8Encoding.UTF8.GetString(buffer); 

     // remove all newlines 
     response = response.Replace(System.Environment.NewLine, ""); 

     /* remove just first empty line 
      if (response.Substring(0, 2) == "\r\n") 
     { 
      response = response.Substring(2, response.Length - 2); 
     } */ 

     filter.Write(UTF8Encoding.UTF8.GetBytes(response), offset, UTF8Encoding.UTF8.GetByteCount(response)); 
    } 
} 

public class ResponseFilter : ActionFilterAttribute 
{ 
    public ResponseFilter() 
    { 
    } 

    public override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     base.OnResultExecuted(filterContext); 
     filterContext.HttpContext.Response.Filter = new TranslationFilter(filterContext.HttpContext.Response); 
    } 
} 

¿Y añadirlo al Método del controlador?

[ResponseFilter] 
public ActionResult Index() 
{ 
return View(); 
} 
+0

Esta no es la solución completa. Aparecen nuevas líneas en cada bloque @ {} (no solo el primero), así que prefiero la solución que manejará eso. Pero, aceptaré su pregunta, si no habrá otra alternativa. –

+0

Ajustado para eliminar todas las líneas nuevas, pero es posible que esto no sea lo que desea: hace que sea más difícil leer la fuente html en el navegador. Me alegro de haber sido de ayuda sin embargo. – Phil

+0

No se trata de eliminar todas las líneas nuevas. Se trata de eliminar líneas compuestas por @ {} bloques. –

2

Sé que le ha sugerido sólo mover la etiqueta al final de la @{} pero ¿por qué lo coloque antes de eso. Además, ¿este espacio en blanco causa un error o un problema? Puedes ver claramente que se debe a los espacios en blanco creados por tu código y no a mvc o navaja de afeitar.

Tal vez algo como esto:

@using InvoiceDocflow.Controllers 
<?xml version="1.1" encoding="UTF-8" ?> 
@{ 
Response.ContentType = "text/xml"; 
} 
1

Otra solución simple sin la ResponseFilter. En pocas palabras el @using en la parte inferior del archivo cshtml:

<?xml version="1.1" encoding="UTF-8" ?> 
<dc> 
    @foreach (var dcLink in (IEnumerable<DcLink>)ViewData["SupportedDcs"]) 
    { 
     <link rel="@dcLink.RelUri.ToString()" href="@dcLink.DcUri.ToString()" /> 
    } 
</dc> 
@using InvoiceDocflow.Controllers 
@{ 
    Response.ContentType = "text/xml"; 
} 
2

Ninguna de las soluciones anteriores dio para mí, así que después de pasar mucho tiempo tratando de arreglarlo - que debe ser muy fácil, ya que es sólo un vacío línea - Escribí una publicación en el blog sobre eso.

http://devstuffs.wordpress.com/2014/02/07/first-line-empty-in-razor/

+0

La "Solución 2" funcionó muy bien (estoy generando un archivo de manifiesto de caché). ¡Gracias por compartir! –

+0

¡La sugerencia de evanswd en el comentario funcionó bien para mí y fue realmente fácil! –

+1

Responda el resumen en línea de la solución o convierta este enlace para comentar. –

1

Si mueve:

<?xml version="1.1" encoding="UTF-8" ?> 

en la parte superior de una plantilla de presentación y en su página XML tienen que heredar y salida de datos XML debería funcionar.

6

Me encontré con un problema similar con líneas en blanco en la parte superior de la página al tratar de devolver un archivo de manifiesto de caché. Solución, agregue un Response.Write ("..."), esto estará en la primera línea de la página.

@{ 
    Layout = null; 
    Response.Write("CACHE MANIFEST"); 

} ....... 
+0

Esta respuesta poco apreciada funcionó para mí. Los archivos XML deben tener el tipo de documento en la primera línea sin ningún espacio en blanco inicial. La sección @ {} se ejecuta antes que cualquier otra cosa en la página. Por lo tanto, Response.Write() también se ejecutará antes de que Razor agregue el espacio blanco externo principal delante del contenido de la página. Mover el tipo de documento a la parte superior de la vista, como se sugiere en otras respuestas, no solucionó el problema. – Roberto

4

Sé que esta es una pregunta anterior, pero la encontré cuando estaba buscando una solución a este problema. Dado que nadie tiene una solución fácil, aquí está el mío:

Pude arreglar esto usando una vista parcial en lugar de una vista normal. Creo que el problema se reduce al diseño, incluso si lo configura como nulo, parece agregar una primera línea en blanco. El @ {} anuncia una línea en blanco también, por lo que debe moverlo al final de su vista.

Entonces sólo tiene que añadir una vista parcial y tienen su controlador devuelve la vista parcial como tal:

public ActionResult GenerateXML() 
{ 
    return PartialView("_XML"); 
} 

Luego, en su vista parcial tendrá que configurarlo como éste (con su @ {} en el abajo):

@model string 
<?xml version="1.0" encoding="UTF-8" ?> 
<response> 
    <message>@Model</message> 
</response> 
@{ Response.ContentType = "text/xml";} 

esto dará lugar a una fuente de HTML:

<?xml version="1.0" encoding="UTF-8" ?> 
<response> 
    <message>Response Message</message> 
</response> 

espero que este ayuda a otros que se encuentran con este problema.

+0

Esta es la única solución que funcionó para mí –

+0

Fácil de implementar, y funcionó de inmediato. –

2

me resolvió el problema similar de esta manera:

_ViewStart.cshtml

@{ 
    Layout = null; 
    Response.Write("<!DOCTYPE html>"); 
} 

Otra .cshtml

@model ViewModel<EshopWebsiteOrder> 
<html> 
<head> 
    <meta charset="utf-8" /> 

Por último, tiene sentido definir DOCTYPE común en una lugar.

Cuestiones relacionadas