2008-09-22 13 views
8

Ich habe einen Beitrag von Brad Wilson (http://bradwilson.typepad.com/blog/2008/08/partial-renderi.html) über die neue ViewEngine Änderungen an MVC Preview 5 gelesen und dachte, dass es toll wäre, eine Ansicht auf String rendern zu können zur Verwendung in Tests. Ich bekomme den Eindruck von dem Artikel, dass es möglich ist, dies zu erreichen, aber ich kann nicht herausfinden, wie.MVC Preview 5 - Rendern einer Ansicht auf String zum Testen

Ich glaube, dies würde uns ermöglichen, einige unserer WatIn-Tests (die langsam und unzuverlässig sind) zu entfernen, da wir überprüfen könnten, ob die View korrekt gerendert wurde, indem einfach die Zeichenfolge auf erwartete Werte/Text überprüft wird.

Hat jemand so etwas implementiert?

Antwort

5

Es ist schwierig. Sie müssen die Response.Filter-Eigenschaft auf eine benutzerdefinierte Stream-Klasse festlegen, die Sie implementieren. Das MVC Contrib Projekt hat tatsächlich Beispiele dafür. Ich würde da drinnen herumstochern.

0

Darüber hinaus kann es für Komponenten wie HTML zu PDF-Konverter nützlich sein. Diese Komponenten verwenden normalerweise zwei Arten der Transformation.

  • Passing eine URL zur Umwandlung Methode
  • einen HTML-Inhalt Passing (und Sie können optional die baseUrl angeben virtuellen Pfade zu lösen)

ich in der Steuerung ein Autorisieren Filter verwende, so Wenn ich auf die URL umleite, ist das gerenderte HTML die Anmeldeseite (ich benutze eine benutzerdefinierte Authentifizierung).

Wenn ich Server.Execute (Url) verwenden, um den Kontext beizubehalten, schlägt die Methode fehl (HttpUnhandledException: Fehler beim Ausführen der untergeordneten Anforderung für/Template/Pdf/1.).

Also habe ich versucht, den HTML-Code des gerenderten ViewResult abzurufen, aber ich war nicht erfolgreich.

1

Ich denke, hier ist, was Sie brauchen. Die RenderPartialToString Funktion gibt den Controller als String zurück. Ich bekomme es von 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(); 
} 
Verwandte Themen