diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/macro.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/macro.resource.js
index 9ba64838c9..c8dc62fc6c 100644
--- a/src/Umbraco.Web.UI.Client/src/common/resources/macro.resource.js
+++ b/src/Umbraco.Web.UI.Client/src/common/resources/macro.resource.js
@@ -36,7 +36,7 @@ function macroResource($q, $http, umbRequestHelper) {
* @methodOf umbraco.resources.macroResource
*
* @description
- * Gets the result of a macro as html to display in the rich text editor
+ * Gets the result of a macro as html to display in the rich text editor or in the Grid
*
* @param {int} macroId The macro id to get parameters for
* @param {int} pageId The current page id
@@ -45,39 +45,16 @@ function macroResource($q, $http, umbRequestHelper) {
*/
getMacroResultAsHtmlForEditor: function (macroAlias, pageId, macroParamDictionary) {
- //need to format the query string for the custom dictionary
var query = "macroAlias=" + macroAlias + "&pageId=" + pageId;
- if (macroParamDictionary) {
- var counter = 0;
- _.each(macroParamDictionary, function (val, key) {
- //check for null
- val = val ? val : "";
- //need to detect if the val is a string or an object
- if (!angular.isString(val)) {
- //if it's not a string we'll send it through the json serializer
- var json = angular.toJson(val);
- //then we need to url encode it so that it's safe
- val = encodeURIComponent(json);
- }
- else {
- //we still need to encode the string, it could contain line breaks, etc...
- val = encodeURIComponent(val);
- }
-
- query += "¯oParams[" + counter + "].key=" + key + "¯oParams[" + counter + "].value=" + val;
- counter++;
- });
- }
return umbRequestHelper.resourcePromise(
- $http.get(
+ $http.post(
umbRequestHelper.getApiUrl(
"macroApiBaseUrl",
- "GetMacroResultAsHtmlForEditor",
- query)),
+ "GetMacroResultAsHtmlForEditorUsingHttpPost",
+ query), JSON.stringify(macroParamDictionary)),
'Failed to retrieve macro result for macro with alias ' + macroAlias);
}
-
};
}
diff --git a/src/Umbraco.Web/Editors/MacroController.cs b/src/Umbraco.Web/Editors/MacroController.cs
index 11fef4a25d..1364679b93 100644
--- a/src/Umbraco.Web/Editors/MacroController.cs
+++ b/src/Umbraco.Web/Editors/MacroController.cs
@@ -49,7 +49,28 @@ namespace Umbraco.Web.Editors
///
///
///
- public HttpResponseMessage GetMacroResultAsHtmlForEditor(string macroAlias, int pageId, [FromUri]IDictionary macroParams)
+ [HttpGet]
+ public HttpResponseMessage GetMacroResultAsHtmlForEditor(string macroAlias, int pageId, [FromUri] IDictionary macroParams)
+ {
+ return GetMacroResultAsHtml(macroAlias, pageId, macroParams);
+ }
+
+ ///
+ /// Gets a rendered macro as html for rendering in the rich text editor.
+ /// Using HTTP POST instead of GET allows for more parameters to be passed as it's not dependant on URL-length limitations like GET.
+ /// The method using GET is kept to maintain backwards compatibility
+ ///
+ ///
+ ///
+ ///
+ ///
+ [HttpPost]
+ public HttpResponseMessage GetMacroResultAsHtmlForEditorUsingHttpPost(string macroAlias, int pageId, [FromBody]IDictionary macroParams)
+ {
+ return GetMacroResultAsHtml(macroAlias, pageId, macroParams);
+ }
+
+ private HttpResponseMessage GetMacroResultAsHtml(string macroAlias, int pageId, IDictionary macroParams)
{
// note - here we should be using the cache, provided that the preview content is in the cache...
@@ -81,7 +102,7 @@ namespace Umbraco.Web.Editors
//the 'easiest' way might be to create an IPublishedContent manually and populate the legacy 'page' object with that
//and then set the legacy parameters.
- var legacyPage = new global::umbraco.page(doc);
+ var legacyPage = new global::umbraco.page(doc);
UmbracoContext.HttpContext.Items["pageID"] = doc.Id;
UmbracoContext.HttpContext.Items["pageElements"] = legacyPage.Elements;
UmbracoContext.HttpContext.Items[global::Umbraco.Core.Constants.Conventions.Url.AltTemplate] = null;