Look at this solution:
Render a view as a string
I used it to generate partial view and it worked. You'll have to switch to partial, but it shouldn't be the problem.
Edit:
I've done some corrects, worked with reflector and used solutions from previous questions. This code looks nicer. View rendering engine is strongly connected to HttpContext.Current, so we have to do some hacking:
/// <summary>Renders a view to string.</summary>
public static string RenderViewToString(this Controller controller,
string viewName, object viewData)
{
//Getting current response
var response = HttpContext.Current.Response;
//Flushing
response.Flush();
//Finding rendered view
var view = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName).View;
//Creating view context
var viewContext = new ViewContext(controller.ControllerContext, view,
controller.ViewData, controller.TempData);
//Since RenderView goes straight to HttpContext.Current, we have to filter and cut out our view
var oldFilter = response.Filter;
Stream filter = new MemoryStream(); ;
try
{
response.Filter = filter;
viewContext.View.Render(viewContext, null);
response.Flush();
filter.Position = 0;
var reader = new StreamReader(filter, response.ContentEncoding);
return reader.ReadToEnd();
}
finally
{
filter.Dispose();
response.Filter = oldFilter;
}
}
It should be easily convertible to allow to render View (change ViewEngines.Engines.FindPartialView to ViewEngines.Engines.FindView). I don't see better solution.