The plumbing has changed with ASP.NET MVC 6 requiring us to think differently, particularly with inversion of control (aka dependency injection) now being a first class citizen.
In my latest adventure, my goal was focused on building a reusable class that allows me to convert a View into a string. This can be used for generating emails, newsletters, or insertion into other views.
To achieve this objective, I dug into the ASP.NET MVC source code to see how it works under the hood (reference blog “how to setup for using / debugging open source code”). To make this work I had to find the parameters required by the view engine’s FindView method and the view’s RenderAsync method.
I then created a new MVC website to prove out the code and updated the HomeController so that the About view injected the Contact views content:
The about.cshtml view was updated to display the raw data provided by the HomeController (line 10 in image below).
With the view done, I complied with the following steps within the HomeController class:
- Paste the ViewHelper class code into the HomeController (source available at end of this blog)
- Update the HomeController constructor so that dependency injection will resolve the ViewHelper via constructor injection (and as a result, its dependencies)
- Update the About() method to set ViewData[“Contact”] with the rendered content of the Contact view (on line 65-66 below).
Perhaps the most important and final step is to ensure the dependency injection container knows about the ViewHelper - this is done on line 49 below in the Startup.ConfigureServices() method.
public class ViewHelper
private IRazorViewEngine _viewEngine;
private ITempDataDictionary _tempDataDict;
_viewEngine = viewEngine;
_tempDataDict = dataDict;
public string RenderToString(
using (var stringWriter = new StringWriter())
var viewEngineResult =
var viewContext = new ViewContext(
var result = stringWriter.GetStringBuilder().ToString();