2011-01-14 7 views

risposta

149

io uso un metodo statico in una classe ho chiamato Utilities.Common mi passano viste al client come proprietà di JSON oggetti continuamente così ho avuto la necessità di renderli a una stringa. Qui ya go:

public static string RenderPartialViewToString(Controller controller, string viewName, object model) 
{ 
    controller.ViewData.Model = model; 
    using (StringWriter sw = new StringWriter()) 
    { 
     ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName); 
     ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw); 
     viewResult.View.Render(viewContext, sw); 

     return sw.ToString(); 
    } 
} 

Questo lavoro per una vista completa e una vista parziale, basta cambiare ViewEngines.Engines.FindPartialView-ViewEngines.Engines.FindView.

+5

raffreddare funziona sia per rasoio e webforms – Omu

+0

Glad ho potuto fare. – Chev

+13

FindView necessita di un altro parametro ('masterName') che specifichi null. Raccomando anche di salvare e ripristinare (dopo il rendering) controller.ViewData.Model nel caso in cui il metodo venga chiamato sull'istanza del controller corrente e il modello sia stato assegnato prima di questa chiamata. –

3

La risposta accettata dalla @Chev sopra è buono, ma ho voluto rendere il risultato di una specifica azione , non solo una particolare vista.

Inoltre, avevo bisogno di essere in grado di passare i parametri a quell'azione piuttosto che fare affidamento sull'iniettare un modello.

Così mi si avvicinò con il mio metodo, che ho messo nella classe base dei miei controllori (rendendolo disponibile a tutti loro):

protected string RenderViewResultAsString(ViewResult viewResult) 
    { 
     using (var stringWriter = new StringWriter()) 
     { 
      this.RenderViewResult(viewResult, stringWriter); 

      return stringWriter.ToString(); 
     } 
    } 

    protected void RenderViewResult(ViewResult viewResult, TextWriter textWriter) 
    { 
     var viewEngineResult = this.ViewEngineCollection.FindView(
      this.ControllerContext, 
      viewResult.ViewName, 
      viewResult.MasterName); 
     var view = viewEngineResult.View; 

     try 
     { 
      var viewContext = new ViewContext(
       this.ControllerContext, 
       view, 
       this.ViewData, 
       this.TempData, 
       textWriter); 

      view.Render(viewContext, textWriter); 
     } 
     finally 
     { 
      viewEngineResult.ViewEngine.ReleaseView(this.ControllerContext, view); 
     } 
    } 

Supponiamo che io abbia un'azione chiamata Foo che prende un modello oggetto e alcuni altri parametri, che insieme influenzano ciò che vista verrà utilizzato:

public ViewResult Foo(MyModel model, int bar) 
    { 
     if (bar == 1) 
      return this.View("Bar1"); 
     else 
      return this.View("Bar2", model); 
    } 

Ora, se voglio ottenere il risultato della chiamata azione Foo, posso semplicemente ottenere il ViewResult invocando la Foo metodo, e quindi chiamare RenderViewResultAsString per ottenere il testo HTML:

var viewResult = this.Foo(model, bar); 

    var html = this.RenderViewResultAsString(viewResult); 
Problemi correlati