2011-01-11 24 views
8

Estamos usando Razor fuera del flujo típico de MVC. Nuestras vistas Razor se invocan desde una transformación XSL a través de una extensión C#. El resultado de la vista Razor se devuelve a la transformación xsl como una cadena. En algunos casos, capturamos el resultado de una vista Razor en una variable xsl y luego lo transferimos a nuestro Modelo para consumirlo como datos en otra vista Razor. Cuando esto sucede, terminamos con la primera vista siendo doblemente codificada, una vez por Razor, la segunda vez a través de la transformación xsl. Necesitamos poder ejecutar Razor sin tener que codificar la salida.Cómo deshabilitar la codificación de HTML para una vista completa de Razor

¿Esto es posible? ¿Cómo lo haríamos?

+2

No es la respuesta completa, pero se puede utilizar @ (nueva HtmlString (Model.Something)) o @ Html.Raw (Model.Something) para eludir la codificación. – jhexp

+0

Gracias. Me siento cómodo con el uso de las funciones de codificación disponibles en la vista. En este caso, devuelvo el resultado del motor de visualización a otro proceso y necesito evitar la codificación realizada por el motor en toda la vista. No es solo cuestión de incrustar algunos datos codificados en la vista. Entiendo que esto no es una implementación estándar. En nuestro caso, tenemos un sistema heredado con muchas restricciones de compatibilidad hacia atrás que estamos tratando de modernizar. Si tiene éxito, usar Razor de esta manera nos permitirá migrar a MVC en un año o dos. Gracias por la entrada. – gidmanma

Respuesta

14

Desde desea desactivar la codificación en toda su punto de vista, la mejor opción sería la de crear su propia clase vista base que hereda de WebPageBase (y sus puntos de vista debe utilizar @inherits para especificar el nuevo tipo) y reemplazar el método Write(object value) por lo que llama a WriteLiteral() en su lugar. De esta forma, la salida no se codificará.

+0

Gracias marcind. Esperaba que respondieras. Lo intentaré. – gidmanma

5

Además del la answer above que permitiría cumplir este modo:

public abstract class TextBasedViewPage : System.Web.Mvc.WebViewPage 
{ 
    public override void Write(object value) 
    { 
     WriteLiteral(value); 
    } 
} 

public abstract class TextBasedViewPage<TModel> : System.Web.Mvc.WebViewPage<TModel> 
{ 
    public override void Write(object value) 
    { 
     WriteLiteral(value); 
    } 
} 

A continuación, en su opinión, se puede comenzar con:

@inherits MyNamespace.TextBasedViewPage<MyModelNamespace.Model> 
Cuestiones relacionadas