diff --git a/src/Umbraco.Web/umbraco.presentation/macro.cs b/src/Umbraco.Web/umbraco.presentation/macro.cs index 80fe808478..8ff8ebffd6 100644 --- a/src/Umbraco.Web/umbraco.presentation/macro.cs +++ b/src/Umbraco.Web/umbraco.presentation/macro.cs @@ -469,7 +469,7 @@ namespace umbraco break; } case (int)MacroTypes.XSLT: - macroControl = loadMacroXSLT(this, Model, pageElements); + macroControl = LoadMacroXslt(this, Model, pageElements, true); break; case (int)MacroTypes.Script: @@ -774,21 +774,20 @@ namespace umbraco return retval; } - public Control loadMacroXSLT(macro macro, MacroModel model, Hashtable pageElements) + internal Control LoadMacroXslt(macro macro, MacroModel model, Hashtable pageElements, bool throwError) { if (XsltFile.Trim() != string.Empty) { // Get main XML - XmlDocument umbracoXML = content.Instance.XmlContent; + var umbracoXml = content.Instance.XmlContent; // Create XML document for Macro - var macroXML = new XmlDocument(); - macroXML.LoadXml(""); + var macroXml = new XmlDocument(); + macroXml.LoadXml(""); - foreach (MacroPropertyModel prop in macro.Model.Properties) + foreach (var prop in macro.Model.Properties) { - addMacroXmlNode(umbracoXML, macroXML, prop.Key, prop.Type, - prop.Value); + addMacroXmlNode(umbracoXml, macroXml, prop.Key, prop.Type, prop.Value); } if (HttpContext.Current.Request.QueryString["umbDebug"] != null && GlobalSettings.DebugMode) @@ -796,7 +795,7 @@ namespace umbraco return new LiteralControl("
Debug from " + macro.Name + - "

" + HttpContext.Current.Server.HtmlEncode(macroXML.OuterXml) + + "

" + HttpContext.Current.Server.HtmlEncode(macroXml.OuterXml) + "

"); } @@ -806,7 +805,7 @@ namespace umbraco try { - Control result = CreateControlsFromText(GetXsltTransformResult(macroXML, xsltFile)); + var result = CreateControlsFromText(GetXsltTransformResult(macroXml, xsltFile)); TraceInfo("umbracoMacro", "After performing transformation"); @@ -824,18 +823,32 @@ namespace umbraco ie = ie.InnerException; } - var macroErrorEventArgs = new MacroErrorEventArgs {Name = Model.Name, Alias = Model.Alias, ItemKey = Model.Xslt, Exception = e, Behaviour = UmbracoSettings.MacroErrorBehaviour}; - return GetControlForErrorBehavior("Error parsing XSLT file: \\xslt\\" + XsltFile, macroErrorEventArgs); + var macroErrorEventArgs = new MacroErrorEventArgs { Name = Model.Name, Alias = Model.Alias, ItemKey = Model.Xslt, Exception = e, Behaviour = UmbracoSettings.MacroErrorBehaviour }; + var macroControl = GetControlForErrorBehavior("Error parsing XSLT file: \\xslt\\" + XsltFile, macroErrorEventArgs); + //if it is null, then we are supposed to throw the (original) exception + // see: http://issues.umbraco.org/issue/U4-497 at the end + if (macroControl == null && throwError) + { + throw; + } + return macroControl; } } catch (Exception e) { Exceptions.Add(e); LogHelper.WarnWithException("Error loading XSLT " + Model.Xslt, true, e); - + // Invoke any error handlers for this macro - var macroErrorEventArgs = new MacroErrorEventArgs {Name = Model.Name, Alias = Model.Alias, ItemKey = Model.Xslt, Exception = e, Behaviour = UmbracoSettings.MacroErrorBehaviour}; - return GetControlForErrorBehavior("Error reading XSLT file: \\xslt\\" + XsltFile, macroErrorEventArgs); + var macroErrorEventArgs = new MacroErrorEventArgs { Name = Model.Name, Alias = Model.Alias, ItemKey = Model.Xslt, Exception = e, Behaviour = UmbracoSettings.MacroErrorBehaviour }; + var macroControl = GetControlForErrorBehavior("Error reading XSLT file: \\xslt\\" + XsltFile, macroErrorEventArgs); + //if it is null, then we are supposed to throw the (original) exception + // see: http://issues.umbraco.org/issue/U4-497 at the end + if (macroControl == null && throwError) + { + throw; + } + return macroControl; } } @@ -843,6 +856,11 @@ namespace umbraco return new LiteralControl(string.Empty); } + public Control loadMacroXSLT(macro macro, MacroModel model, Hashtable pageElements) + { + return LoadMacroXslt(macro, model, pageElements, false); + } + /// /// Parses the text for umbraco Item controls that need to be rendered. ///