Thanks Martin. I managed to get around this issue (as I didn't want the ScriptManager control on the live site because of the additional payload) by doing the following:
On master (I needed to have the outer placeholder "plcManagers"):
<asp:PlaceHolder runat="server" ID="plcManagers">
<cms:CMSPageManager ID="cmsPageManager" runat="server" EnableViewState="false" />
<asp:PlaceHolder runat="server" ID="phScriptManager" />
</asp:PlaceHolder>
On a template code-behind:
private void CreateScriptManager()
{
if (CMSContext.ViewMode == ViewModeEnum.Edit)
{
var script = new ScriptManager();
script.ID = "ScriptManager1";
this.FindControl("Form").FindControl("plcManagers").FindControl("phScriptManager").Controls.Add(script);
}
}
That way, only the "Page" tab in the CMS uses this functionality, keeping the public facing side of it lighter in terms of payload size.