<

PLEASE NOTE: Our current delivery time is 6 weeks.

Only two weeks delivery with our Lotus Stock Program

>
Error executing template "Designs/kebe-e5/eCom/Product/espresso.cshtml"
System.Exception: _dynamicwebProduct is not Active. Settings are: {"JsonConvert.SerializeObject":"Newtonsoft.Json.JsonSerializationException: Self referencing loop detected with type 'Dynamicweb.Ecommerce.Variants.VariantGroup'. Path 'Product.VariantGroups[0].VariantGroupProductRelations[0].VariantGroups'.
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CheckForCircularReference(JsonWriter writer, Object value, JsonProperty property, JsonContract contract, JsonContainerContract containerContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IEnumerable values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IEnumerable values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IEnumerable values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)
at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)
at Newtonsoft.Json.JsonConvert.SerializeObjectInternal(Object value, Type type, JsonSerializer jsonSerializer)
at Newtonsoft.Json.JsonConvert.SerializeObject(Object value)
at System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site, T0 arg0, T1 arg1)
at Co3.Espresso.Website.Services.JsonService.ToJson(Object obj)"}
at Co3.Espresso.Website.Models.FrontEnd.Ecommerce.EspressoProduct.Populate(ProductSettings settings)
at Co3.Espresso.Website.Services.ProductService.GetEspressoProduct(ProductSettings settings)
at Co3.Espresso.Website.Models.FrontEnd.Ecommerce.EspressoProduct.get_VariantCombinations()
at CompiledRazorTemplates.Dynamic.RazorEngine_990475d14ef54b0fbeee34164fa3fe32.Execute() in E:\Dynamicweb.NET\Solutions\kebe.espresso4.dk\Files\Templates\Designs\kebe-e5\eCom\Product\espresso.cshtml:line 634
at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader)
at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.<RunCompile>b__0(TextWriter writer)
at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
at Dynamicweb.Rendering.Template.RenderRazorTemplate()

1 @inherits Co3.Espresso.Website.TemplateBases.Paragraphs.Module @using System.Web @using Co3.Espresso.Base.Extensions @using Co3.Espresso.Base.Models @using Co3.Espresso.Website.Services @using Co3.Espresso.Website.Models @using Co3.Espresso.Website.Models.Settings @using Co3.Espresso.Website.Models.FrontEnd @using Co3.Espresso.Website.Models.FrontEnd.Settings @using Co3.Espresso.Website.Models.FrontEnd.Ecommerce @using Co3.Espresso.Website.Models.FrontEnd.Handlebars @using Co3.Kebe.Website.Models.Ecommerce @using Dynamicweb.Ecommerce @using Dynamicweb.Ecommerce.Common @using Dynamicweb.Ecommerce.Products @using Dynamicweb.Ecommerce.Products.Categories @using Dynamicweb.Ecommerce.Products.FieldDisplayGroups @using Dynamicweb.Security.UserManagement @using Dynamicweb.Frontend @using Dynamicweb.Security.UserManagement @using ProductService = Co3.Espresso.Website.Services.ProductService @{ bool isUserAuthenticated = User.IsExtranetUserLoggedIn(); KebeProduct espressoProduct = ( KebeProduct ) ProductService.Instance.GetEspressoProduct( new ProductSettings() { Id = GetString( "Ecom:Product.ID" ), VariantId = GetString( "Ecom:Product.VariantID" ), PrimaryVariantId = GetString( "Ecom:Product.DefaultVariantComboID" ) } ); Product dwProduct = ProductService.Instance.GetProductById( GetString( "Ecom:Product.ID" ), GetString( "Ecom:Product.VariantID" ), false ); // Add auto generated relation groups fra Dynamicweb to RelatedGroups dictionary, in order to access them the same way, as the custom related product groups. espressoProduct.RelatedGroups.Add( espressoProduct.WhatAboutTheseProducts.Id, espressoProduct.WhatAboutTheseProducts ); espressoProduct.RelatedGroups.Add( espressoProduct.CustomersWhoSawThisAlsoSaw.Id, espressoProduct.CustomersWhoSawThisAlsoSaw ); espressoProduct.RelatedGroups.Add( espressoProduct.CustomersWhoBoughtThisItemAlsoBought.Id, espressoProduct.CustomersWhoBoughtThisItemAlsoBought ); espressoProduct.RelatedGroups.Add( espressoProduct.YouHaveSeenTheseProducts.Id, espressoProduct.YouHaveSeenTheseProducts ); string howItWorksPage = Espresso.Page.Area.Item[ "EcommerceHowToOrderPage" ]?.ToString(); // Related product groups are rendered in this order. string[] relatedGroupIds = { "similarproducts" }; } @RenderingService.Instance.SectionEnd() <section class="e-product js-e-product js-e-product-item-@espressoProduct.Id" data-product-id="@espressoProduct.Id" data-has-variants="@espressoProduct.HasVariants.ToString().ToLower()" data-variant-id="@espressoProduct.VariantId" product-height-high="@espressoProduct.HeightHigh" product-height-std="@espressoProduct.HeightStd" product-height-low="@espressoProduct.HeightLow"> @RenderingService.Instance.SectionStart( new SectionSettings { Classes = new ClassList( "e-section pb-1" ), ContentClasses = new ClassList( "col-12 " ) } ) @RenderingService.Instance.PartialView( "ecom/product/partials/kebe-product-header.cshtml", espressoProduct ) @RenderingService.Instance.SectionEnd() @RenderingService.Instance.SectionStart( new SectionSettings { Classes = new ClassList( "e-section pb-2" ), ContentClasses = new ClassList( "col-12" ) } ) <div class="col-12"> <div class="row"> <div class="col-12 col-lg-5 col-xl-4 pb-4"> <div class="e-product-text-container border border-dark p-2"> @RenderingService.Instance.PartialView( "ecom/product/partials/kebe-variant-matrix.cshtml", espressoProduct ) </div> </div> <div class="col-12 col-lg-7 col-xl-8 order-first"> @RenderingService.Instance.PartialView( "ecom/product/partials/images.cshtml", espressoProduct ) </div> </div> </div> @RenderingService.Instance.SectionEnd() @RenderingService.Instance.PartialView( "ecom/product/partials/kebe-product-description.cshtml", espressoProduct ) @{ string jsonSrc = "/system/data/product"; string jsonSrcGetParams = HttpUtility.HtmlAttributeEncode( JsonService.Instance.ToJson( new Dictionary< string, string > { {"productId", espressoProduct.Id}, {"variantId", espressoProduct.VariantId} } ) ); <section class="e-section border-top py-3 e-section-collapse" id="specifications"> <div class="js-e-jsonpublisher js-kebe-specifications container-fluid" data-json-src="@jsonSrc" data-json-src-get-params="@jsonSrcGetParams" data-template=".js-e-handlebars-tmpl-kebe-specifications" data-template-helpers="counter compare"> <div class="row"> <div class="col-12 col-xl-10 mx-auto e-section-collapse-toggle collapsed order-last text-center" data-toggle="collapse" data-target="#specifactions-collapse"> <button class="btn btn-primary e-section-collapse-toggle-btn" type="button"> <i class="material-icons e-section-collapse-toggle-icon mx-0">keyboard_arrow_down</i> </button><small class="h4 e-section-collapse-toggle-text" data-expand-text="Show more" data-collapse-text="Show less"></small> </div> <div class="col-12 col-lg-7 px-3 mx-auto e-section-collapse-content collapse is-lg" id="specifactions-collapse"> <div class="row"> <h2 class="col-12 text-center mb-0">@Translate( "eCom Product - Specifications - Heading", "Specifications" )</h2> @if ( espressoProduct.Description.Count > 0 ) { <div class="col-12 mb-3 px-2"> <h3 class="h4 text-center text-lg-left mt-4 col-12 e-product-name mb-2 pl-0">@Translate( "eCom Product - FieldDisplayGroups - Description", "Description" )</h3> <table class="table table-sm"> @foreach ( FieldDisplayGroupItem description in espressoProduct.Description ) { if (description.Value != "0" && description.Value != "0.0 cm" && description.Value != "False") { <tr> <th style="width: 50%"> @description.Label </th> <td> @description.Value </td> </tr> } } @if (espressoProduct.HeightStd != "0.0 cm") { <tr> <th style="width: 50%"> @Translate("eCom Product - Specifications Height - Label", "Height") </th> <td> <span class="js-kebe-product-height">@espressoProduct.HeightStd</span> </td> </tr> } @if (espressoProduct.SeatingHeightStd != "0.0 cm") { <tr> <th style="width: 50%"> @Translate("eCom Product - Specifications Seating Height - Label", "Seating Height") </th> <td> <span class="js-kebe-product-seating-height">@espressoProduct.SeatingHeightStd</span> </td> </tr> } @if (espressoProduct.HasReturnSwivel != false) { <tr> <th style="width: 50%"> @Translate("eCom Product - Specifications Return Swivel - Label", "Return Swivel") </th> <td> <span class="js-kebe-product-return-swivel">No</span> </td> </tr> } </table> </div> } @if (espressoProduct.LegsFeets.Count > 0 || espressoProduct.HasReturnSwivel != false) { KebeVariantOption kebeVariantOptionSokkelType = new KebeVariantOption(); if (espressoProduct.VariantGroups.ContainsKey("SokkelType")) { kebeVariantOptionSokkelType = (KebeVariantOption) espressoProduct.VariantGroups["SokkelType"].Options[espressoProduct.VariantGroups["SokkelType"].SelectedOptionId]; } <div class="col-12 mb-3 px-2"> <h3 class="h4 text-center text-lg-left mt-4 col-12 e-product-name mb-2 pl-0">@Translate("eCom Product - FieldDisplayGroups - Legs & Feets", "Legs & Feets")</h3> <table class="table table-sm"> @foreach (FieldDisplayGroupItem legsFeet in espressoProduct.LegsFeets) { if (legsFeet.Value != "False") { <tr> <th style="width: 50%"> @legsFeet.Label </th> <td> @legsFeet.Value </td> </tr> } } @if (espressoProduct.HasReturnSwivel != false) { <tr> <th style="width: 50%"> @Translate("eCom Product - Specifications Return Swivel - Label", "Return Swivel") </th> <td> <span class="js-kebe-product-return-swivel">No</span> </td> </tr> } @if (espressoProduct.VariantGroups.ContainsKey("SokkelType")) { <tr> <th style="width: 50%"> @Translate("eCom Product - Specifications Leg Type - Label", "Leg Type") </th> <td> <span class="js-kebe-product-legstype">@kebeVariantOptionSokkelType.Sokkeltype</span> </td> </tr> } </table> </div> } @if ( espressoProduct.Fabric.Count > 0 ) { KebeVariantOption kebeVariantOptionCover = (KebeVariantOption) espressoProduct.VariantGroups["Cover"].Options[espressoProduct.VariantGroups["Cover"].SelectedOptionId]; <div class="col-12 mb-3 px-2"> <h3 class="h4 text-center text-lg-left mt-4 col-12 e-product-name mb-2 pl-0">@Translate( "eCom Product - FieldDisplayGroups - Fabric", "Fabric" )</h3> <table class="table table-sm"> @foreach ( FieldDisplayGroupItem fabric in espressoProduct.Fabric ) { <tr> <th style="width: 50%"> @fabric.Label </th> <td> @fabric.Value </td> </tr> } <tr> <th style="width: 50%"> @Translate("eCom Product - Specifications Color group - Label", "Color group") </th> <td> <span>@kebeVariantOptionCover.ColorGroup</span> </td> </tr> <tr> <th style="width: 50%"> @Translate("eCom Product - Specifications Color - Label", "Color") </th> <td> <span>@kebeVariantOptionCover.Farve</span> </td> </tr> <tr> <th style="width: 50%"> @Translate("eCom Product - Specifications Fabric Name - Label", "Fabric name") </th> <td> @kebeVariantOptionCover.Kvalitet </td> </tr> <tr> <th style="width: 50%"> @Translate("eCom Product - Specifications Fabric Name - Label", "Fabric name") </th> <td> @kebeVariantOptionCover.FabricType </td> </tr> @if (!string.IsNullOrEmpty(kebeVariantOptionCover.Composition)) { <tr> <th style="width: 50%"> @Translate("eCom Product - Specifications Composition - Label", "Composition") </th> <td> @kebeVariantOptionCover.Composition </td> </tr> } @if (!string.IsNullOrEmpty(kebeVariantOptionCover.Aniline)) { <tr> <th style="width: 50%"> @Translate("eCom Product - Specifications Aniline - Label", "Aniline") </th> <td> @kebeVariantOptionCover.Aniline </td> </tr> } @if (!string.IsNullOrEmpty(kebeVariantOptionCover.Thickness)) { <tr> <th style="width: 50%"> @Translate("eCom Product - Specifications Thickness - Label", "Thickness") </th> <td> @kebeVariantOptionCover.Thickness </td> </tr> } @if (!string.IsNullOrEmpty(kebeVariantOptionCover.LightFastness)) { <tr> <th style="width: 50%"> @Translate("eCom Product - Specifications LightFastness - Label", "LightFastness") </th> <td> @kebeVariantOptionCover.LightFastness </td> </tr> } @if (!string.IsNullOrEmpty(kebeVariantOptionCover.Pilling)) { <tr> <th style="width: 50%"> @Translate("eCom Product - Specifications Pilling - Label", "Pilling") </th> <td> @kebeVariantOptionCover.Pilling </td> </tr> } </table> </div> } @if ( espressoProduct.Logistics.Count > 0 ) { <div class="col-12 mb-3 px-2"> <h3 class="h4 text-center text-lg-left mt-4 col-12 e-product-name mb-2 pl-0">@Translate( "eCom Product - FieldDisplayGroups - Logistics", "Logistics" )</h3> <table class="table table-sm"> @foreach ( FieldDisplayGroupItem logistic in espressoProduct.Logistics ) { <tr> <th style="width: 50%"> @logistic.Label </th> <td> @logistic.Value </td> </tr> } </table> </div> } </div> </div> </div> <script class="js-e-handlebars-tmpl-kebe-specifications" type="text/x-handlebars-template"> <div class="row"> <div class="col-12 col-xl-10 mx-auto e-section-collapse-toggle collapsed order-last text-center" data-toggle="collapse" data-target="#specifactions-collapse"> <button class="btn btn-primary e-section-collapse-toggle-btn" type="button"> <i class="material-icons e-section-collapse-toggle-icon mx-0">keyboard_arrow_down</i> </button> <small class="h4 e-section-collapse-toggle-text" data-expand-text="Show more" data-collapse-text="Show less"></small> </div> <div class="col-12 col-lg-7 px-3 mx-auto e-section-collapse-content collapse is-lg" id="specifactions-collapse"> <div class="row"> <h2 class="col-12 text-center mb-0">@Translate( "eCom Product - Specifications - Heading", "Specifications" )</h2> {{#if specifications.description.length}} <div class="col-12 mb-3 px-2"> <h3 class="h4 text-center text-lg-left mt-4 col-12 e-product-name mb-2 pl-0">@Translate( "eCom Product - FieldDisplayGroups - Description", "Description" )</h3> <table class="table table-sm"> {{#each specifications.description}} {{#compare Value '!==' '0'}} {{#compare Value '!==' '0.0 cm'}} {{#compare Value '!==' 'False'}} <tr> <th style="width: 50%"> {{{Label}}} </th> <td> {{{Value}}} </td> </tr> {{/compare}} {{/compare}} {{/compare}} {{/each}} {{#compare heigtStd '!==' '0.0 cm'}} <tr> <th style="width: 50%"> @Translate("eCom Product - Specifications Height - Label", "Height") </th> <td> <span class="js-kebe-product-height">{{heigtStd}}</span> </td> </tr> {{/compare}} {{#compare seatingHeightStd '!==' '0.0 cm'}} <tr> <th style="width: 50%"> @Translate("eCom Product - Specifications Seating Height - Label", "Seating Height") </th> <td> <span class="js-kebe-product-seating-height">{{seatingHeightStd}}</span> </td> </tr> {{/compare}} {{#compare hasReturnSwivel '!==' 'false'}} <tr> <th style="width: 50%"> @Translate("eCom Product - Specifications Return Swivel - Label", "Return Swivel") </th> <td> <span class="js-kebe-product-return-swivel">No</span> </td> </tr> {{/compare}} </table> </div> {{/if}} {{#compare specifications.legsFeets.length '||' hasReturnSwivel }} <div class="col-12 mb-3 px-2"> <h3 class="h4 text-center text-lg-left mt-4 col-12 e-product-name mb-2 pl-0">@Translate( "eCom Product - FieldDisplayGroups - Legs & Feets", "Legs & Feets" )</h3> <table class="table table-sm"> {{#compare hasReturnSwivel '!==' 'false'}} <tr> <th style="width: 50%"> @Translate("eCom Product - Specifications Return Swivel - Label", "Return Swivel") </th> <td> <span class="js-kebe-product-return-swivel">No</span> </td> </tr> {{/compare}} {{#each specifications.legsFeets}} {{#compare Value '!==' 'False'}} <tr> <th style="width: 50%"> {{{Label}}} </th> <td> {{{Value}}} </td> </tr> {{/compare}} {{/each}} {{#if Sokkeltype}} <tr> <th style="width: 50%"> @Translate("eCom Product - Specifications Leg Type - Label", "Leg Type") </th> <td> <span class="js-kebe-product-legstype">{{Sokkeltype}}</span> </td> </tr> {{/if}} </table> </div> {{/compare}} {{#if specifications.fabrics.length}} <div class="col-12 mb-3 px-2"> <h3 class="h4 text-center text-lg-left mt-4 col-12 e-product-name mb-2 pl-0">@Translate( "eCom Product - FieldDisplayGroups - Fabric", "Fabric" )</h3> <table class="table table-sm"> {{#each specifications.fabrics}} <tr> <th style="width: 50%"> {{{Label}}} </th> <td> {{{Value}}} </td> </tr> {{/each}} <tr><th style="width: 50%"> @Translate("eCom Product - Specifications Color group - Label","Color group") </th> <td> <span>{{ColorGroup}}</span> </td> </tr> <tr> <th style="width: 50%"> @Translate("eCom Product - Specifications Color - Label","Color") </th> <td> <span>{{Farve}}</span> </td> </tr> <tr> <th style="width: 50%"> @Translate("eCom Product - Specifications Fabric Name - Label","Fabric name") </th> <td> <span>{{Kvalitet}}</span> </td> </tr> <tr> <th style="width: 50%"> @Translate("eCom Product - Specifications Fabric Type - Label","Fabric type") </th> <td> <span>{{FabricType}}</span> </td> </tr> {{#if Composition}} <tr> <th style="width: 50%"> @Translate("eCom Product - Specifications Composition - Label", "Composition") </th> <td> {{Composition}} </td> </tr> {{/if}} {{#if Aniline}} <tr> <th style="width: 50%"> @Translate("eCom Product - Specifications Aniline - Label", "Aniline") </th> <td> {{Aniline}} </td> </tr> {{/if}} {{#if Thickness}} <tr> <th style="width: 50%"> @Translate("eCom Product - Specifications Thickness - Label", "Thickness") </th> <td> {{Thickness}} </td> </tr> {{/if}} {{#if LightFastness}} <tr> <th style="width: 50%"> @Translate("eCom Product - Specifications LightFastness - Label", "LightFastness") </th> <td> {{LightFastness}} </td> </tr> {{/if}} {{#if Pilling}} <tr> <th style="width: 50%"> @Translate("eCom Product - Specifications Pilling - Label", "Pilling") </th> <td> {{Pilling}} </td> </tr> {{/if}} </table> </div> {{/if}} {{#if specifications.logistics.length}} <div class="col-12 mb-3 px-2"> <h3 class="h4 text-center text-lg-left mt-4 col-12 e-product-name mb-2 pl-0">@Translate( "eCom Product - FieldDisplayGroups - Logistics", "Logistics" )</h3> <table class="table table-sm"> {{#each specifications.logistics}} <tr> <th style="width: 50%"> {{{Label}}} </th> <td> {{{Value}}} </td> </tr> {{/each}} </table> </div> {{/if}} </div> </div> </div> </script> </div> </section> } @if ( espressoProduct.RelatedGroups.ContainsKey( "RELGRP5" ) && espressoProduct.RelatedGroups[ "RELGRP5" ].Products.Any() ) { @RenderingService.Instance.SectionStart( new SectionSettings { Classes = new ClassList( "e-section py-2 bg-light" ) } ) @RenderingService.Instance.PartialView( "ecom/product/partials/related-products.cshtml", espressoProduct.RelatedGroups[ "RELGRP5" ] ) @RenderingService.Instance.SectionEnd() } @RenderingService.Instance.PartialView( "ecom/product/partials/metadata.cshtml", espressoProduct ) @RenderingService.Instance.PartialView( "ecom/product/partials/gtm-tracking.cshtml", espressoProduct ) <code class="js-e-breadcrumb-item-append" data-text="@HttpUtility.HtmlAttributeEncode( espressoProduct.Name )" data-link="@HttpUtility.HtmlAttributeEncode( espressoProduct.Link )"></code> <script> e4.data.set('@( espressoProduct.Id )_VariantCombinationTree', JSON.parse( '@HttpUtility.JavaScriptStringEncode( JsonService.Instance.ToJson( espressoProduct.VariantCombinationTree ) )')); e4.data.set('@( espressoProduct.Id )_VariantCombinationIds', JSON.parse( '@HttpUtility.JavaScriptStringEncode( JsonService.Instance.ToJson( espressoProduct.VariantCombinations.Keys ) )')); </script> </section>
keyboard_arrow_up