2008-09-22 14 views
8

Estaba leyendo una publicación de Brad Wilson (http://bradwilson.typepad.com/blog/2008/08/partial-renderi.html) sobre los nuevos cambios de ViewEngine en MVC Preview 5 y pensé que sería genial poder renderizar una vista en string para uso en pruebas. Me da la impresión del artículo de que es posible lograr esto, pero no puedo entender cómo.MVC Preview 5 - Renderizar una vista a String para prueba

Creo que esto nos permitiría eliminar algunas de nuestras pruebas de WatIn (que son lentas y poco confiables) ya que nos permitiría verificar que la Vista se haya procesado correctamente simplemente marcando la cadena para los valores/texto esperados.

¿Alguien ha implementado algo como esto?

Respuesta

5

Es complicado. Lo que tiene que hacer es establecer la propiedad Response.Filter en una clase de flujo personalizado que implemente. El proyecto MVC Contrib en realidad tiene ejemplos de hacer esto. Me gustaría hurgar allí.

0

Además de las pruebas, puede ser útil para componentes como convertidores de HTML a PDF. Estos componentes generalmente usan 2 formas de transformación.

  • Pasar una URL para el método de conversión
  • Pasar un contenido HTML (y opcionalmente puede especificar el baseUrl para resolver caminos virtuales)

estoy usando un filtro Autorizar dentro del controlador, por lo si redirijo a la URL, el HTML renderizado es la página de inicio de sesión uno (uso una autenticación personalizada).

Si uso Server.Execute (Url) para mantener el contexto, el método falla (HttpUnhandledException: Error al ejecutar la solicitud secundaria para/Template/Pdf/1).

Intenté recuperar el HTML del ViewResult renderizado pero no tuve éxito.

1

Creo que esto es lo que necesita. La función RenderPartialToString devolverá el controlador como una cadena. Lo recibo de here.

public static string RenderPartialToString(string controlName, object viewData) 
{ 
    ViewDataDictionary vd = new ViewDataDictionary(viewData); 
    ViewPage vp = new ViewPage { ViewData = vd }; 
    Control control = vp.LoadControl(controlName); 

    vp.Controls.Add(control); 

    StringBuilder sb = new StringBuilder(); 
    using (StringWriter sw = new StringWriter(sb)) 
    { 
     using (HtmlTextWriter tw = new HtmlTextWriter(sw)) 
     { 
      vp.RenderControl(tw); 
     } 
    } 

    return sb.ToString(); 
} 
Cuestiones relacionadas