Error executing template "Designs/OttoSchachner/Partials/ProductList.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
at CompiledRazorTemplates.Dynamic.RazorEngine_712bd12d44ee408c81febe57d457ed6e.<ExecuteAsync>g__RenderItem|0_0(Object dynamicProduct, <>c__DisplayClass0_0&)
at CompiledRazorTemplates.Dynamic.RazorEngine_712bd12d44ee408c81febe57d457ed6e.ExecuteAsync()
at RazorEngine.Templating.TemplateBase.Run(ExecuteContext context, TextWriter reader)
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.DynamicWrapperService.Run(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineServiceExtensions.Run(IRazorEngineService service, String name, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass23_0.<Run>b__0(TextWriter writer)
at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
at RazorEngine.Templating.RazorEngineServiceExtensions.Run(IRazorEngineService service, String name, Type modelType, Object model, DynamicViewBag viewBag)
at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
at Dynamicweb.Rendering.Template.RenderRazorTemplate()
1 @using Dynamicweb.Content
2 @using Dynamicweb.Ecommerce.CustomerExperienceCenter.Favorites
3 @using Dynamicweb.Ecommerce.Products
4 @using Dynamicweb.Frontend
5 @using Dynamicweb.VestjyskMarketing.Helpers
6 @{
7 bool slider = Dynamicweb.Core.Converter.ToBoolean(Model.Template.ViewParameters["slider"]);
8 int itemsToShow = Dynamicweb.Core.Converter.ToInt32(Model.Template.ViewParameters["itemsToShow"]);
9 int cols = 12 / itemsToShow;
10 bool favoriteListDetails = false;
11 var pageService = new PageService();
12 bool signedIn = PageView.Current().User != null;
13 var user = PageView.Current().User;
14
15
16 int shopPageId = Dynamicweb.Content.Services.Pages.GetPageByNavigationTag(PageView.GetAreaByDomain().ID, "Shop").ID;
17
18 string colsClass = "col-12 col-md-6 col-lg-" + cols;
19 dynamic products = new List<dynamic>();
20 var productService = new Dynamicweb.Ecommerce.Products.ProductService();
21
22 if (Model.Template.ViewParameters.ContainsKey("products"))
23 {
24 products = Model.Template.ViewParameters["products"];
25 }
26
27
28 if (products.Count == 0)
29 {
30 return;
31 }
32
33
34 //my account - favorite list details
35 if (Model.Template.ViewParameters.ContainsKey("favoriteListDetails"))
36 {
37 favoriteListDetails = Dynamicweb.Core.Converter.ToBoolean(Model.Template.ViewParameters["favoriteListDetails"]);
38 }
39
40 //make funktion that renders html
41 string RenderItem(dynamic dynamicProduct)
42 {
43 Dynamicweb.Ecommerce.Products.Product product = productService.GetProductById(dynamicProduct.Id, dynamicProduct.VariantId, dynamicProduct.LanguageId);
44 double fromPrice = product.DefaultPrice;
45 if (product.GetVariantCombinations() != null)
46 {
47 int counterVariants = 0;
48 foreach (var variant in product.GetVariantCombinations())
49 {
50 Dynamicweb.Ecommerce.Products.Product productVariant = productService.GetProductById(dynamicProduct.Id, variant.VariantId, dynamicProduct.LanguageId);
51 if (productVariant != null)
52 {
53 if ((counterVariants == 0 || productVariant.DefaultPrice < fromPrice) && productVariant.DefaultPrice > 0)
54 {
55 counterVariants++;
56 fromPrice = productVariant.DefaultPrice;
57 }
58 }
59
60 }
61 }
62
63 string type = dynamicProduct.GetType().ToString();
64 bool isProductViewModel = type == "Dynamicweb.Ecommerce.ProductCatalog.ProductViewModel";
65
66
67 string imageUrl = new ProductImageService().GetImagePath(product);
68 string imageSrc = "";
69
70
71 @if (!string.IsNullOrEmpty(imageUrl))
72 {
73 Dynamicweb.VestjyskMarketing.Models.ResizeImageSettings imageSettings = new Dynamicweb.VestjyskMarketing.Models.ResizeImageSettings
74 {
75 Width = 1920,
76 Height = 1920,
77 Crop = "5",
78 Quality = 90,
79 AlternativeImage = "/Files/Images/missing_image.jpg",
80 Image = imageUrl
81 };
82 imageSrc = Dynamicweb.VestjyskMarketing.Helpers.ImageHelper.ResizeImage(imageSettings);
83 }
84 else
85 {
86 imageSrc = "/Files/Images/missing_image.jpg";
87 }
88
89 string productUrl = "/Default.aspx?ID=" + shopPageId + "&groupid=" + product.GetDefaultGroup().Id + "&productid=" + product.Id;
90
91 <div class="position-relative h-100">
92
93
94 @if (favoriteListDetails)
95 {
96 string deleteLink = "/Default.aspx?ID=" + PageView.Current().ID + $"&ProductID={product.Id}&ProductVariantId={product.VariantId}&FavoriteListId={Dynamicweb.Context.Current.Request.QueryString["ListID"]}&FavoriteCmd=removeproductfromfavoritelist";
97
98 <a class="product-list__delete" href="@deleteLink" title="Fjern fra liste">
99 <span class="far fa-trash-alt"></span>
100 </a>
101 }
102
103 @if (isProductViewModel && signedIn)
104 {
105 string favoriteLink = "/Default.aspx?ID=" + pageService.GetPageByNavigationTag(PageView.Current().AreaID, "FavoriteService").ID + "&ProductID=" + product.Id + "&ProductVariantId=" + dynamicProduct.VariantId + "&UserID=" + PageView.Current().User.ID + "&ReloadPage=false";
106 bool isInFavoriteList = false;
107 var favoriteLists = user.GetFavoriteLists();
108 int favoriteListContainingProductId = 0;
109 string command = "add";
110
111 foreach (var favoriteList in favoriteLists)
112 {
113 isInFavoriteList = user.IsProductInFavoriteList(favoriteList.ListId, product.Id, "");
114
115 if (isInFavoriteList)
116 {
117 favoriteListContainingProductId = favoriteList.ListId;
118 command = "remove";
119
120 break;
121 }
122 }
123
124 <a data-command="@command" data-in-this-list="@favoriteListContainingProductId" data-url="@favoriteLink" href="javascript:void(0)" title="Tilføj eller fjern fra favoritter" class="product-list__favorite">
125 @if (isInFavoriteList)
126 {
127 <i class="fa-sharp fa-solid fa-heart"></i>
128 }
129 else
130 {
131 <i class="fa-regular fa-heart"></i>
132 }
133 </a>
134 }
135
136
137 <a title="Gå til produkt" href="@productUrl" class="product-list__product d-flex flex-column ">
138 @{
139 string altText = OttoSchachner.Api.AISeo.GetProductImageAlt(product.Id, product.VariantId, product.LanguageId, imageUrl).FirstOrDefault()?.Alt ?? "produkt beskrivelse";
140 if (string.IsNullOrEmpty(altText))
141 {
142 altText = product.Name;
143 }
144 }
145 <img loading="lazy" class="product-list__product__image" src="@imageSrc" alt="@altText" />
146
147 <div class="d-flex flex-column mt-3 flex-grow-1 justify-content-between">
148 <div class="product-list__product__name">
149 @product.Name
150 </div>
151
152 @{
153 bool signenIn = PageView.Current().User != null;
154 bool isAssortmentGroup = Dynamicweb.Core.Converter.ToBoolean(product.Groups?.Any(g => g.Name.ToLower().Contains("logovare")));
155 }
156
157 <div class="product-list__product__price-container d-flex flex-row align-items-center justify-content-between">
158 @if (signenIn)
159 {
160 @if (isProductViewModel && !isAssortmentGroup)
161 {
162
163 <div class="product-list__product__price-container__price">
164 Fra @fromPrice.ToString("F2") KR
165 </div>
166 }
167 }
168 else
169 {
170 <div class="product-list__product__price-container__signin">
171 Login for pris
172 </div>
173 }
174
175 @{
176 string hiddenClass = "";
177
178 if (favoriteListDetails)
179 {
180 hiddenClass = "invisible";
181 }
182 }
183
184 <i class="@hiddenClass fa-solid fa-cart-shopping product-list__product__price-container__cart"></i>
185 </div>
186 </div>
187 </a>
188 </div>
189
190
191 return "";
192 }
193 }
194
195 @if (slider)
196 {
197 <div class="position-relative">
198
199 <div data-slidesperview="@itemsToShow" class="product-list__gallery overflow-hidden">
200 <div class="swiper-wrapper col-12">
201
202
203 @foreach (var product in products)
204 {
205 <div class="swiper-slide">
206 @RenderItem(product)
207 </div>
208 }
209
210
211 </div>
212
213 <div class="product-list__gallery__navigation position-absolute top-50 translate-middle-y z-1 justify-content-between d-flex w-100">
214 <i class="os-chevron os-chevron--prev bi-chevron-left productlist-prev"></i>
215 <i class="os-chevron bi-chevron-right productlist-next"></i>
216 </div>
217
218 </div>
219 </div>
220 }
221 else
222 {
223 foreach (var product in products)
224 {
225 <div class="@colsClass">
226 @RenderItem(product)
227 </div>
228 }
229 }