Question

What's the "skeleton" code for using CsQuery in the code-behind of a MasterPage in order to modify the HTML output? I need to be able to modify everything in the <body> of the HTML?

I'm hoping to use CsQuery to "touch-up" the HTML output of a Dynamic Data website without rewriting / messing with the default code.

Just looking for sample code specific to MasterPage code-behind? Thanks.

Was it helpful?

Solution

There is an example in the CsQuery project that shows how to do this (which I just made sure was working right!) in the CsQuery.WebFormsApp project.

The core of the usage looks like this. You must override the Render method in a class that inherits Page, and use this instead of Page as the base class for the codebehind in an aspx page:

public class CsQueryPage: System.Web.UI.Page
{
    public CQ Doc { get; protected set; }

    protected override void Render(System.Web.UI.HtmlTextWriter writer)
    {
        // most of the work is done for you with the
        // `CsQuery.WebForms.CreateFromRender` method

        var csqContext = WebForms.CreateFromRender(this, base.Render, writer);

        // if you are using update panels, this lets you also manipulate that
        // HTML, otherwise you don't need the IsAsync part

        if (csqContext.IsAsync)
        {
            foreach (var item in csqContext.AsyncPostbackData) {
                 Cq_RenderUpdatePanel(item.Dom,item.ID);
            }
        }
        else
        {
            Doc = csqContext.Dom;
            Cq_Render();
        }

        // writes the altered content to the base HtmlTextWriter

        csqContext.Render();
    }

    protected virtual void Cq_Render() 
    { }

    protected virtual void Cq_RenderUpdatePanel(CQ doc, string updatePanelId) 
    { }
}

The two virtual methods are where you can alter the dom, which is populated in the Doc property of the CsQueryPage object - the intent of leaving them unimplemented here is that each aspx page that inherits CsQueryPage can optionally override them and make changes to the DOM.

To see how this works in practice just pull down the CsQuery code from github and run the example.

The same technique can be used for a UserControl which is also shown in the example. I don't actually show how to do it with MasterPage but it's very much the same-- MasterPage derives from UserControl, you just override it's Render method same as the other situations.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top