Возможное решение, которое я реализовал, - создать собственный ViewResult и выполнить там работу. Это не элегантное решение, так как я просто скопировал и вставил обычную реализацию в переопределенный ExecuteResult и настроил обработанный вывод. Эта строка:
View.Render(viewContext, context.HttpContext.Response.Output);
становится:
TextWriter writer = new StringWriter();
View.Render(viewContext, writer);
string renderedResult = writer.ToString();
renderedResult = renderedResult.Replace("hello", "goodbye");
context.HttpContext.Response.Output.Write(renderedResult);
Соответствующий источник здесь:
http://aspnet.codeplex.com/SourceControl/changeset/view/23011#288022
Это довольно ужасный способ сделать это IMO, но он работает.