Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get html from MVC 4 view into a string

Tags:

I am trying to use the accepted answer from this question.

It seems that it will be exactly what i am looking for, but i have a problem. I don't know how to actually call it. This is what i have so far:

First i am copying the code from the solution i mentioned:

public string ToHtml(string viewToRender, ViewDataDictionary viewData, ControllerContext controllerContext) {     var result = ViewEngines.Engines.FindView(controllerContext, viewToRender, null);      StringWriter output;     using (output = new StringWriter())     {         var viewContext = new ViewContext(controllerContext, result.View, viewData, controllerContext.Controller.TempData, output);         result.View.Render(viewContext, output);         result.ViewEngine.ReleaseView(controllerContext, result.View);     }      return output.ToString(); } 

This is what i have:

string viewToRender = "..."; int Data1 = ...; int Data2 = ...;  System.Web.Mvc.ViewDataDictionary viewData = new System.Web.Mvc.ViewDataDictionary(); viewData.Add("Data1",Data1); viewData.Add("Data2",Data2);  string html = ToHtml(viewToRender, viewData, ?????)//Here is my problem. 

What should i pass in the controllerContext parameter?

like image 989
Giannis Paraskevopoulos Avatar asked Aug 26 '13 10:08

Giannis Paraskevopoulos


People also ask

What method is used to render HTML String in a view?

You can use the Html. Raw() method for that.


2 Answers

Rather than inherit Controller which means you have to remember to implement this every time, or inherit from a CustomControllerBase, which means you have to remember to inherit every time - simply make an extension method:

public static class ControllerExtensions {     public static string RenderView(this Controller controller, string viewName, object model)     {         return RenderView(controller, viewName, new ViewDataDictionary(model));     }      public static string RenderView(this Controller controller, string viewName, ViewDataDictionary viewData)     {         var controllerContext = controller.ControllerContext;          var viewResult = ViewEngines.Engines.FindView(controllerContext, viewName, null);          StringWriter stringWriter;          using (stringWriter = new StringWriter())         {             var viewContext = new ViewContext(                 controllerContext,                 viewResult.View,                 viewData,                 controllerContext.Controller.TempData,                 stringWriter);              viewResult.View.Render(viewContext, stringWriter);             viewResult.ViewEngine.ReleaseView(controllerContext, viewResult.View);         }          return stringWriter.ToString();     } } 

Then within your Controller you can call like this:

this.RenderView("ViewName", model); 
like image 92
dav_i Avatar answered Sep 18 '22 15:09

dav_i


You can create a base controller which obviously extends a controller and use above function in the base controller and other controller which extends this base controller will be able to use it. However the ControllerContext must be used as

Request.RequestContext 

And Hence your BaseController will be like

public class BaseController: Controller { //your function here } 

And your ToHtml() function will be

protected virtual string ToHtml(string viewToRender, ViewDataDictionary viewData ) {    var controllerContext=Request.RequestContext;    var result = ViewEngines.Engines.FindView(controllerContext, viewToRender, null);     StringWriter output;    using (output = new StringWriter())    {       var viewContext = new ViewContext(controllerContext, result.View, viewData, controllerContext.Controller.TempData, output);       result.View.Render(viewContext, output);       result.ViewEngine.ReleaseView(controllerContext, result.View);    }     return output.ToString(); } 

And on using the base controller

public class MyController: BaseController { //ToHtml(...); } 
like image 29
serene Avatar answered Sep 21 '22 15:09

serene