Я использую Handlebarsjs для создания шаблонов. У меня есть интерфейс, который предоставляет редактор, где пользователь будет создавать шаблоны. На стороне клиента я хочу предварительно скомпилировать шаблон и сохранить его на сервере с помощью Jquery Ajax. Серверная сторона - ASP.NET Core MVC
Допустим, у пользователя есть автор следующего шаблона
<script id="entry-template" type="text/x-handlebars-template">
<div>whatever {{ name }}</div>
</script>
При нажатии кнопки «Сохранить» у меня есть следующий код, чтобы предварительно скомпилировать шаблон и сохранить его на сервере.
$("#btnSave").click(function () {
var source = $("#entry-template").html();
var str = Handlebars.precompile(source);
$.post("/home/save", JSON.stringify(str))
});
Handlebars.precompile метод возвращает функции javascript в виде строки. Как ниже
"{"compiler":[7,">=
4.0.0"],"main":function(container,depth0,helpers,partials,data) {
var helper;
return "\n <div>whatever "
+ container.escapeExpression(((helper = (helper = helpers.name || (depth0 !=
null ? depth0.name : depth0)) != null ? helper : helpers.helperMissing),
(typeof helper === "function" ? helper.call(depth0 != null ? depth0 :
(container.nullContext || {}),{"name":"name","hash":{},"data":data}) :
helper)))
+ "</div>\n";
},"useData":true}"
Однако ASP.NET Core MVC возвращает ошибку
ArgumentException: ключ '"{\" compiler \ ": [7, \">' является недопустимым JQuery
синтаксис, потому что отсутствует закрывающая скобка. Имя параметра: ключ
Microsoft.AspNetCore.Mvc.ModelBinding.JQueryKeyValuePairNormalizer.NormalizeJQueryToMvc (StringBuilder
строитель, строковый ключ)
Microsoft.AspNetCore.Mvc.ModelBinding.JQueryKeyValuePairNormalizer.GetValues (IEnumerable> originalValues, int valueCount)
Microsoft.AspNetCore.Mvc.ModelBinding.JQueryFormValueProviderFactory.AddValueProviderAsync (ValueProviderFactoryContext
контекст)
Microsoft.AspNetCore.Mvc.ModelBinding.CompositeValueProvider.CreateAsync (ActionContext
actionContext, фабрики IList)
Microsoft.AspNetCore.Mvc.ModelBinding.CompositeValueProvider.CreateAsync (ControllerContext
controllerContext)
Microsoft.AspNetCore.Mvc.Internal.ControllerBinderDelegateProvider + <> c__DisplayClass0_0 + d.MoveNext ()
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync ()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter ()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow (ResourceExecutedContext
контекст) Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next (ref
Состояние следующее, область действия ref, состояние объекта ref, ссылка bool isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync ()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync ()
Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke (HttpContext
HttpContext)
Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke (HttpContext
HttpContext)
Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke (HttpContext
контекст)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke (HttpContext
контекст)
Контроллер ASP.NET
[HttpPost]
public IActionResult Save([FromBody]string str)
{
PreCompiledScript = str;
return Ok();
}