Как опубликовать предварительно скомпилированный шаблон handlebarsjs на сервер? - PullRequest
0 голосов
/ 01 мая 2019

Я использую 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();
    }
...