2011-01-14 9 views

Odpowiedz

149

używam metody statyczne w klasie I zwanego Utilities.Common mijam widoki z powrotem do klienta jako właściwości JSON obiektów stale więc miałem potrzebę uczynienia ich do ciąg znaków. Tu 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(); 
    } 
} 

To będzie działać na pełnym widokiem, a także częściowym widokiem, wystarczy zmienić ViewEngines.Engines.FindPartialView do ViewEngines.Engines.FindView.

+5

ostygnie to działa zarówno brzytwa i webforms – Omu

+0

Cieszę się, że mogłem pomóc. – Chev

+13

FindView wymaga innego parametru ('masterName'), który można określić jako zero. Polecam również zapisywanie i przywracanie (po renderowaniu) controller.ViewData.Model w przypadku wywołania metody na bieżącej instancji kontrolera i model został przypisany przed tym wywołaniem. –

3

Przyjęty przez @Chev powyżej odpowiedź jest dobra, ale chciałem, aby uczynić wynik konkretnej działania, a nie tylko konkretnej widzenia.

Potrzebowałem również móc przekazywać parametry do tego działania, a nie polegać na wstrzykiwaniu modelu.

Więc wymyślił własną metodę, że mogę umieścić w klasie bazowej moich kontrolerami (udostępnianie ich wszystkich):

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); 
     } 
    } 

Załóżmy, że mam działanie nazywa Foo że trwa model przedmiot i niektóre inne parametry, które wpływają na to, co razem widok będzie używany:

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

teraz, jeśli chcę uzyskać wynik wywołania działania Foo, mogę po prostu uzyskać ViewResult powołując się Foo metoda, a następnie zadzwonić RenderViewResultAsString uzyskać tekst HTML:

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

    var html = this.RenderViewResultAsString(viewResult); 
Powiązane problemy