views:

596

answers:

2

Howdy,

I want to extend the WebFormViewEngine so that I can perform some post-processing - I want it to do it's stuff, then hand me the Html back, so I can do put some final touches to it. It needs to be done as a View/ViewEngine because I need access to the ViewData.

Unfortunately there seems to be no way to get the Html back from the WebFormView, and no way to hand a custom HtmlTextWriter to the WebFormView or ViewPage.

Surely there's a way to do this? No?

Littlecharva

A: 

Okay, I have never done this before but I looked through reflector and the MVC assemblies. It appears as though you it might be possible to extend the ViewPage and the ViewPage and the ViewMasterPage object with your object. The in your own object you can override the render method and get a handle tot the HtmlTextWriter. Then just pass it on to the base and let it do it's thing. Something like this (this is un-tested and is only theoretical, there may be more methods you need to override.) I recommend using reflector to see how it is done now and even how other view engines like Spark do it.

public class MyPage : ViewPage
{
    protected override void Render(System.Web.UI.HtmlTextWriter writer)
    {
        //Do custom stuff here
        base.Render(writer);
    }
}
public class MyPage<TModel> : MyPage where TModel : class
{
}
Kyle LeNeau
I had used reflector and investigated that route, the problem is that there appears to be no way to have the WebViewEngine instantiate my ViewPage instead of the default one. It seems to use a BuildManager, but there's no obvious way to control the BuildManager.
littlecharva
+2  A: 

You can use Action Filters to do this. Check out this tutorial at asp.net/mvc. You want to use a ResultsFilter.

As an alternate, you can override the virtual OnResultExecuted method of the Controller.

Matthew
Thanks, that gets me a little closer to where I want to be.I can obviously acheive what I want using Action Filters or overriding OnResultExecuted, but I feel the code I'm writing belongs in a ViewEngine, as it will be run on ALL views.
littlecharva
It may run on all views in THIS application, but not every application. You don't want to be changing the framework for every project.
Matthew