Error executing template "Designs/Swift-v2/eCom/ProductCatalog/VariantSelector.cshtml"
System.InvalidCastException: Unable to cast object of type 'Dynamicweb.Ecommerce.ProductCatalog.ProductListViewModel' to type 'Dynamicweb.Ecommerce.ProductCatalog.ProductViewModel'.
at RazorEngine.Templating.TemplateBase`1.SetModel(Object model)
at RazorEngine.Templating.TemplateBase.SetData(Object model, DynamicViewBag viewbag)
at RazorEngine.Templating.RazorEngineCore.CreateTemplate(ICompiledTemplate template, Object model, DynamicViewBag viewbag)
at RazorEngine.Templating.RazorEngineCore.RunTemplate(ICompiledTemplate template, TextWriter writer, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineService.Run(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.DynamicWrapperService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineServiceExtensions.RunCompile(IRazorEngineService service, String name, 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 RazorEngine.Templating.RazorEngineServiceExtensions.RunCompile(IRazorEngineService service, String name, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineServiceExtensions.RunCompile(IRazorEngineService service, String templateSource, String name, Type modelType, Object model, DynamicViewBag viewBag)
at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template) in /_/src/Application/Providers/Dynamicweb.Rendering.Providers.NetCore/Razor/RazorTemplateRenderingProvider.cs:line 82
at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template) in E:\A10\_w\2\s\src\Core\Dynamicweb.Core\Rendering\TemplateRenderingService.cs:line 14
at Dynamicweb.Rendering.Template.RenderRazorTemplate() in E:\A10\_w\2\s\src\Core\Dynamicweb.Core\Rendering\Template.cs:line 805
1 @inherits ViewModelTemplate<ProductViewModel>
2 @using Dynamicweb.Frontend
3 @using Dynamicweb.Rendering
4 @using Dynamicweb.Ecommerce.ProductCatalog
5 @using System.Globalization
6
7 @functions{
8 string DoubleToString(double? value)
9 {
10 if (value.HasValue)
11 {
12 return value.Value.ToString(CultureInfo.InvariantCulture);
13 }
14 return null;
15 }
16 }
17
18 @{
19 if (Dynamicweb.Context.Current.Items.Contains("ProductDetails"))
20 {
21 Dynamicweb.Context.Current.Items["ProductDetails"] = Model;
22 }
23 else
24 {
25 Dynamicweb.Context.Current.Items.Add("ProductDetails", Model);
26 }
27
28 string viewType = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("ViewType")) ? Dynamicweb.Context.Current.Request.Form.Get("ViewType") : string.Empty;
29 bool quantitySelector = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("QuantitySelector")) ? Convert.ToBoolean(Dynamicweb.Context.Current.Request.Form.Get("QuantitySelector")) : false;
30
31 string url = "/Default.aspx?ID=" + (GetPageIdByNavigationTag("CartService"));
32 if (!url.Contains("LayoutTemplate"))
33 {
34 url += url.Contains("?") ? "&LayoutTemplate=Swift-v2_MiniCart.cshtml" : "?LayoutTemplate=Swift-v2_MiniCart.cshtml";
35 }
36
37 //Basic ParagraphViewModel setting
38 var paragraphViewModel = new ParagraphViewModel()
39 {
40 ID = 123456789
41 };
42
43 string buttonLayout = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("ButtonLayout")) ? Dynamicweb.Context.Current.Request.Form.Get("ButtonLayout") : string.Empty;
44 string buttonAspectRatio = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("ButtonAspectRatio")) ? Dynamicweb.Context.Current.Request.Form.Get("ButtonAspectRatio") : string.Empty;
45
46 var parms = new Dictionary<string, object>();
47 parms.Add("ButtonLayout", buttonLayout);
48 parms.Add("ButtonAspectRatio", buttonAspectRatio);
49 }
50
51 @if (Model.VariantInfo?.VariantInfo != null)
52 {
53 if (viewType == "ModalContent")
54 {
55 string disableAddToCart = null;
56 double? stepQty = Model.PurchaseQuantityStep > 0 ? Model.PurchaseQuantityStep : 1;
57 double? minQty = Model.PurchaseMinimumQuantity > 0 ? Model.PurchaseMinimumQuantity : 1;
58 double? maxQty = null;
59 double? valueQty = minQty > stepQty ? minQty : stepQty;
60 bool isStockType = Model.ProductType == Dynamicweb.Ecommerce.Products.ProductType.Stock;
61 if (isStockType)
62 {
63 if (Model.NeverOutOfstock)
64 {
65 disableAddToCart = "disabled";
66 }
67 else
68 {
69 disableAddToCart = (Model.StockLevel <= 0) || Model.Discontinued ? "disabled" : disableAddToCart;
70 maxQty = Model.StockLevel;
71 }
72 }
73
74 disableAddToCart = string.IsNullOrEmpty(Model.VariantId) ? "disabled" : disableAddToCart;
75
76 <div class="modal-header">
77 <h5 class="modal-title">@Model.Name</h5>
78 <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
79 </div>
80 <div class="modal-body">
81 @RenderPartial("Components/VariantSelector.cshtml", paragraphViewModel, parms)
82 </div>
83 <div class="modal-footer">
84 <form method="post" action="@url">
85 <input type="hidden" name="redirect" value="false">
86 <input type="hidden" name="ProductName" value="@Model.Name">
87 <input type="hidden" name="ProductVariantName" value="@Model.VariantName">
88 <input type="hidden" name="ProductId" value="@Model.Id">
89 <input type="hidden" name="VariantId" value="@Model.VariantId" id="VariantIdField_@Model.Id">
90 <input type="hidden" name="ProductReferer" value="variant_selector">
91 <input type="hidden" name="cartcmd" value="add">
92
93 <input type="hidden" name="ProductCurrency" value="@Dynamicweb.Ecommerce.Common.Context.Currency.Code">
94 <input type="hidden" name="ProductReferer" value="variant_selector_modal">
95 <input type="hidden" name="ProductPrice" value="@Model.Price.ToStringInvariant()">
96
97 <template class="js-step-quantity-warning">
98 <div class="modal-header">
99 <h5 class="modal-title">@Translate("The quantity is not valid")</h5>
100 </div>
101 <div class="modal-body">
102 <p class="text-muted">@Translate("Please select a quantity that is dividable by") @stepQty</p>
103 </div>
104 </template>
105
106 <template class="js-min-quantity-warning">
107 <div class="modal-header">
108 <h5 class="modal-title">@Translate("The product could not be added to the cart")</h5>
109 </div>
110 <div class="modal-body">
111 <p class="text-muted">@Translate("The quantity is not valid. You must buy at least") @Model.PurchaseMinimumQuantity</p>
112 </div>
113 </template>
114
115 <template class="js-value-missing-warning">
116 <div class="modal-header">
117 <h5 class="modal-title">@Translate("No amount specified")</h5>
118 <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
119 </div>
120 <div class="modal-body">
121 <p class="text-muted">@Translate("Specify an amount to add to the cart")</p>
122 </div>
123 </template>
124
125 @if (quantitySelector)
126 {
127 <div class="d-flex flex-fill flex-column flex-sm-row gap-2">
128 @RenderPartial("Components/QuantitySelector.cshtml", Model)
129 <button type="button" onclick="swift.Cart.Update(event)" class="btn btn-primary flex-fill js-add-to-cart-button" data-dw-button="primary" title="@Translate("Add to cart")" id="AddToCartButton@(Model.Id)_@Pageview.CurrentParagraph.ID" @disableAddToCart>@Translate("Add to cart")</button>
130
131 <div class="invalid-feedback d-none">
132 @Translate("Please select a quantity that is dividable by") @stepQty
133 </div>
134
135 </div>
136 <label for="Quantity_@(Model.Id)_@Model.VariantId" class="visually-hidden">@Translate("Quantity")</label>
137 }
138 else
139 {
140 <input id="Quantity_@(Model.Id)_@Model.VariantId" name="Quantity" value="@DoubleToString(valueQty)" type="hidden" @disableAddToCart>
141 <button type="button" onclick="swift.Cart.Update(event)" class="btn btn-primary flex-fill js-add-to-cart-button" data-dw-button="primary" title="@Translate("Add to cart")" id="AddToCartButton@(Model.Id)_@Pageview.CurrentParagraph.ID" @disableAddToCart>@Translate("Add to cart")</button>
142 }
143 </form>
144 </div>
145 }
146 else
147 {
148 @RenderPartial("Components/VariantSelector.cshtml", paragraphViewModel)
149 }
150
151 <script type="module">
152 swift.VariantSelector.init();
153 </script>
154 }
155