public string Execute(MacroModel macro, INode currentPage)
        {
            if (macro == null) throw new ArgumentNullException("macro");
            if (currentPage == null) throw new ArgumentNullException("currentPage");
			if (macro.ScriptName.IsNullOrWhiteSpace()) throw new ArgumentException("The ScriptName property of the macro object cannot be null or empty");
		
            if (!macro.ScriptName.StartsWith(SystemDirectories.MvcViews + "/MacroPartials/")
                && (!Regex.IsMatch(macro.ScriptName, "~/App_Plugins/.+?/Views/MacroPartials", RegexOptions.Compiled)))
            {
                throw new InvalidOperationException("Cannot render the Partial View Macro with file: " + macro.ScriptName + ". All Partial View Macros must exist in the " + SystemDirectories.MvcViews + "/MacroPartials/ folder");
            }

            var http = _getHttpContext();
            var umbCtx = _getUmbracoContext();
            var routeVals = new RouteData();
            routeVals.Values.Add("controller", "PartialViewMacro");
            routeVals.Values.Add("action", "Index");
            routeVals.DataTokens.Add("umbraco-context", umbCtx); //required for UmbracoViewPage

			//lets render this controller as a child action if we are currently executing using MVC 
			//(otherwise don't do this since we're using webforms)
			var mvcHandler = http.CurrentHandler as MvcHandler;
			var viewContext = new ViewContext {ViewData = new ViewDataDictionary()};;
			if (mvcHandler != null)
			{
				//try and extract the current view context from the route values, this would be set in the UmbracoViewPage.
				if (mvcHandler.RequestContext.RouteData.DataTokens.ContainsKey(Constants.DataTokenCurrentViewContext))
				{
					viewContext = (ViewContext) mvcHandler.RequestContext.RouteData.DataTokens[Constants.DataTokenCurrentViewContext];
				}
				routeVals.DataTokens.Add("ParentActionViewContext", viewContext);
			}

            var request = new RequestContext(http, routeVals);
            string output;
            using (var controller = new PartialViewMacroController(umbCtx, macro, currentPage))
            {
				//bubble up the model state from the main view context to our custom controller.
				//when merging we'll create a new dictionary, otherwise you might run into an enumeration error
				// caused from ModelStateDictionary
				controller.ModelState.Merge(new ModelStateDictionary(viewContext.ViewData.ModelState));
				controller.ControllerContext = new ControllerContext(request, controller);
				//call the action to render
                var result = controller.Index();
				output = controller.RenderViewResultAsString(result);
            }

            return output;
        }
        public string Execute(MacroModel macro, IPublishedContent content)
        {
            if (macro == null) throw new ArgumentNullException("macro");
            if (content == null) throw new ArgumentNullException("content");
			if (macro.ScriptName.IsNullOrWhiteSpace()) throw new ArgumentException("The ScriptName property of the macro object cannot be null or empty");
		
            var http = _getHttpContext();
            var umbCtx = _getUmbracoContext();
            var routeVals = new RouteData();
            routeVals.Values.Add("controller", "PartialViewMacro");
            routeVals.Values.Add("action", "Index");
            routeVals.DataTokens.Add("umbraco-context", umbCtx); //required for UmbracoViewPage

			//lets render this controller as a child action if we are currently executing using MVC 
			//(otherwise don't do this since we're using webforms)
			var mvcHandler = http.CurrentHandler as MvcHandler;
			var viewContext = new ViewContext {ViewData = new ViewDataDictionary()};;
			if (mvcHandler != null)
			{
				//try and extract the current view context from the route values, this would be set in the UmbracoViewPage.
				if (mvcHandler.RequestContext.RouteData.DataTokens.ContainsKey(Umbraco.Web.Mvc.Constants.DataTokenCurrentViewContext))
				{
					viewContext = (ViewContext) mvcHandler.RequestContext.RouteData.DataTokens[Umbraco.Web.Mvc.Constants.DataTokenCurrentViewContext];
				}
				routeVals.DataTokens.Add("ParentActionViewContext", viewContext);
			}

            var request = new RequestContext(http, routeVals);
            string output;
            using (var controller = new PartialViewMacroController(macro, content))
            {
				//bubble up the model state from the main view context to our custom controller.
				//when merging we'll create a new dictionary, otherwise you might run into an enumeration error
				// caused from ModelStateDictionary
				controller.ModelState.Merge(new ModelStateDictionary(viewContext.ViewData.ModelState));
				controller.ControllerContext = new ControllerContext(request, controller);
				//call the action to render
                var result = controller.Index();
				output = controller.RenderViewResultAsString(result);
            }

            return output;
        }