How can I render a Razor View to a string (in full framework ASP.NET)?

  • Page Owner: Not Set
  • Last Reviewed: 2022-04-28

I need to render a Razor view, but I need it as a string, rather than returned as a View. How can I do that?


Answer

We do this by creating hand-creating some contexts and view engine, and calling the Render method of the view engine. See the example code (from the Mercury project) below:

        public static string RenderViewToString(string controllerName, string viewName, object viewData)
        {
            using (var writer = new StringWriter())
            {
                var routeData = new RouteData();
                routeData.Values.Add("controller", controllerName);
                var fakeControllerContext = GenerateFakeController(routeData);

                var razorViewEngine = new RazorViewEngine();
                var razorViewResult = razorViewEngine.FindView(fakeControllerContext, viewName, "", false);

                var tempData = new TempDataDictionary();
                tempData.Add("ApiMode", true); // Add TempData[] items here.

                var viewContext = new ViewContext(fakeControllerContext, razorViewResult.View, new ViewDataDictionary(viewData), tempData, writer);
                razorViewResult.View.Render(viewContext, writer);
                return writer.ToString();
            }
        }

        private static ControllerContext GenerateFakeController(RouteData routeData)
        {
            var hostname = SiteDefinition.Current.SiteUrl.ToString();
            var fakeRequest = new HttpRequest(null, hostname, null);
            var contextWrapper = new HttpContextWrapper(new HttpContext(fakeRequest, new HttpResponse(null)));

            return new ControllerContext(contextWrapper, routeData, new YourControllerHere());
        }