Rendering a view to a string in ASP.NET MVC 2

1.3k Views Asked by At

We need to render an ActionResult to a string to add pages to our internal search engine index. We settled on this solution to render to string.

I've run into a problem with the ExecuteResult call used to process the View.

Code Snippet:

var oldController = controllerContext.RouteData.Values["controller"];
controllerContext.RouteData.Values["controller"] = 
                  typeof(TController).Name.Replace("Controller", "");

viewResult.ExecuteResult(controllerContext); // this line breaks

I receive the following error:

"Object reference not set to instance of object" error.

I've confirmed viewResult is not null, so the exception has to be thrown internally in ExecuteResult.

What could we be missing?

4

There are 4 best solutions below

0
On BEST ANSWER

I figured it out. The issue with ExecuteResult wasn't working as expected was because I hadn't mocked the ControllerContext properly. I was able to solve the issue by mocking the controllercontext as described in this SO post:

Mocking Asp.net-mvc Controller Context

Hope this post helps someone in the future if they're trying to do something similar.

1
On

MVCContrib has a BlockRenderer class which could be helpful for this scenario.

0
On

I haven't tried it myself but Phil Haack did suggest a way to output a view to a string here with MVC in mind.

0
On

Not a direct answer to your question, but why would you render the whole view as a string to your search index, rather than either a) pushing the data itself into the index (LINQ to Lucene lets you do this w/ attributes) or b) offloading the work to a separate process that crawls the front end using some set of rights?