Error executing template "Designs/Rapido/eCom/ProductCatalog/ProductDetailNevotex.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
at CompiledRazorTemplates.Dynamic.RazorEngine_b9badb0d7c1f487fa7bbca4508334ade.Execute() in F:\sites\NevotexProd\WEB\Application\Files\Templates\Designs\Rapido\eCom\ProductCatalog\ProductDetailNevotex.cshtml:line 25
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 @using System 2 @using Dynamicweb.Rendering 3 @using Dynamicweb.Ecommerce.ProductCatalog 4 @using Nevotex.Data.Entities 5 @using Nevotex.Data.Helpers 6 @using Nevotex.Data.Services 7 @using System.Collections.Generic; 8 @using System.Text; 9 @inherits ViewModelTemplate<ProductViewModel> 10 11 @{ 12 var productServiceForDetails = new ProductService(); 13 var productPageId = GetPageIdByNavigationTag("ProductsPage"); 14 var groupId = Dynamicweb.Context.Current.Request.QueryString["groupid"]; 15 16 if(string.IsNullOrEmpty(groupId)) 17 { 18 groupId = GroupHelper.GetPrimaryGroup(Model.Id); 19 } 20 21 Pageview.Meta.Title = Model.Name; 22 23 24 var currentGroup = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(groupId); 25 var rendera_4bilden = Convert.ToBoolean(currentGroup.ProductGroupFieldValues.GetProductGroupFieldValue("Rendera_4bilden").Value); 26 var renderFullImage = Convert.ToBoolean(currentGroup.ProductGroupFieldValues.GetProductGroupFieldValue("RenderFullImage").Value.ToString()); 27 var crop = currentGroup.ProductGroupFieldValues.GetProductGroupFieldValue("RenderFullImage").Value.ToString() == "collection" ? 0 : 5; 28 var productService = new ProductService(); 29 var path = Model.Number; 30 var productId = Model.Id; 31 var productName = Model.Name; 32 var productNumber = Model.Number; 33 var productVariantId = Model.VariantId; 34 var productLanguageId = Model.LanguageId; 35 var uses = productService.GetProductCategoryFieldValue("Anvndningsomrade", productId); 36 var useValues = uses.Split(','); 37 38 var productSheetPageId = GetPageIdByNavigationTag("ProductSheetNevotex"); 39 var mainProduct = Dynamicweb.Ecommerce.Services.Products.GetProductById(productId, null, false); 40 var encodedMainProductName = System.Web.HttpUtility.UrlEncode(mainProduct.Name); 41 var productSheetLink = $"/default.aspx?id={productSheetPageId}&amp;MainProductId={productId}&amp;VariantID={productVariantId}&amp;pdf=true&amp;render_4={rendera_4bilden.ToString()}&amp;filename={encodedMainProductName}-Nevotex.pdf"; 42 43 if (rendera_4bilden) 44 { 45 path = path + "_4"; 46 } 47 48 if (renderFullImage) { 49 crop = 5; 50 } 51 52 IEnumerable<MediaViewModel> assetsImages = Model.AssetCategories.Where(x => x.SystemName == "Images").SelectMany(x => x.Assets); 53 List<MediaViewModel> assetsList = new List<MediaViewModel>(); 54 55 assetsList.Add(Model.DefaultImage); 56 57 foreach (MediaViewModel ai in assetsImages) 58 { 59 assetsList.Add(ai); 60 } 61 foreach (MediaViewModel ip in Model.ImagePatternImages) 62 { 63 assetsList.Add(ip); 64 } 65 66 var imgPath = $"/Admin/Public/GetImage.ashx?width=705&height=524&crop={crop}&FillCanvas=True&DoNotUpscale=true&Compression=99&image=/Files/Images/produktbilder/{path}.jpg"; 67 68 <div class="product__info dw-mod u-margin-bottom--lg js-product" data-renderfull-image="@renderFullImage"> 69 <div class="grid grid--align-content-start"> 70 71 <div class="product__top paragraph-container paragraph-container--full-width dw-mod"> 72 <div class="center-container dw-mod"> 73 <div class="grid"> 74 <div class="grid__col-lg-6 grid__col-md-6 grid__col-sm-12 grid__col-xs-12 dw-mod" id="Block__MainImage"> 75 <div class="grid grid--align-content-start dw-mod" id="Block__MainImageRow"> 76 <input type="checkbox" id="GalleryModalTrigger" class="modal-trigger"> 77 <div class="modal-container"> 78 <label for="GalleryModalTrigger" id="GalleryModalOverlay" class="modal-overlay"></label> 79 <div class="modal modal--lg modal-height--full" id="GalleryModal"> 80 <div class="modal__body "> 81 <div class="modal__body_text"></div> 82 <div class="carousel dw-mod carousel--horizontal" id="modalCarousel"> 83 <div class="thumb-list carousel__container js-carousel-slides dw-mod"> 84 @foreach (MediaViewModel img in assetsList) 85 { 86 var imagePath = img.GetFileViewModel().PathUrlEncoded; 87 var getImagePath = $"/Admin/Public/GetImage.ashx?width=1410&amp;height=1048&amp;crop={crop}&amp;FillCanvas=True&amp;DoNotUpscale=true&amp;Compression=99&amp;image={imagePath}&amp;AlternativeImage=/Images/missing_image.jpg"; 88 89 <div class="carousel__slide dw-mod carousel__slide--horizontal"> 90 <img class="b-lazy modal--full__img dw-mod" src="/Files/Images/placeholder.gif" data-src="@getImagePath" alt="@productName" title="@productName"> 91 </div> 92 } 93 94 </div> 95 96 <script> 97 document.addEventListener("DOMContentLoaded", function () { 98 modalCarousel = new CarouselModule('#modalCarousel', { 99 slidesInView: 1, 100 direction: "horizontal", 101 preloaderSize: 3, 102 showCounter: true 103 }); 104 }); 105 </script> 106 <div class="js-carousel-controls"><div class="carousel-prev-btn dw-mod"></div><div class="carousel-next-btn dw-mod"></div><div class="carousel__counter">1 / 3</div></div> 107 </div> 108109 </div> 110 <label class="modal__close-btn" for="GalleryModalTrigger"></label> 111 </div> 112 </div> 113 <div class="grid__col-lg-12 grid__col-md-12 grid__col-sm-12 grid__col-xs-12 dw-mod" id="Block__Image"> 114 <label for="GalleryModalTrigger" class="product__image-container u-position-relative"> 115 <img id="Image_@Model.Id" class=" u-middle product__image-container__image dw-mod dw-mod" src="@imgPath" onclick="modalCarousel.GoToSlide('modalCarousel', this.getAttribute('data-number'))" alt="@productName" title="@productName" data-number="0"> 116 </label> 117 </div> 118 <div class="grid__col-lg-12 grid__col-md-12 grid__col-sm-12 grid__col-xs-12 dw-mod" id="Block__Carousel"> 119 <div class="product__thumbs dw-mod"> 120 <div class="carousel dw-mod carousel--horizontal" id="productCarousel"> 121 <div class="thumb-list carousel__container js-carousel-slides dw-mod" style="left: 0px; width: 60%;"> 122123 @foreach (MediaViewModel img in assetsList) 124 { 125 var imagePath = img.GetFileViewModel().PathUrlEncoded; 126 var getImagePath = $"/Admin/Public/GetImage.ashx?width=705&amp;height=524&amp;crop={crop}&amp;FillCanvas=True&amp;DoNotUpscale=true&amp;Compression=99&amp;image={imagePath}"; 127 var getImageSmallPath = $"/Admin/Public/GetImage.ashx?Width=200&amp;Height=200&amp;Crop={crop}&amp;DoNotUpscale=True&amp;FillCanvas=True&amp;Image={imagePath}&amp;AlternativeImage=/Images/missing_image.jpg"; 128129 <div class="carousel__slide dw-mod carousel__slide--horizontal"> 130 <div data_path="@imagePath" class="thumb-list__item dw-mod js-thumb js-gallery js-thumb--active thumb-list__item--active" data-for="Image_@Model.Id" data-image="@getImagePath" onmouseover="Gallery.openImage(this)"> 131 <label for="GalleryModalTrigger" class="thumb-list__image-label"> 132 <img class="b-lazy u-middle thumb-list__image dw-mod b-loaded" src="@getImageSmallPath" onclick="modalCarousel.GoToSlide('modalCarousel', this.closest('.carousel__slide').index());" alt="@Model.Name" title="@Model.Name" data-image="@imagePath"> 133134 </label> 135 </div> 136 </div> 137 } 138 </div> 139140 <script> 141 document.addEventListener("DOMContentLoaded", function () { 142 productCarousel = new CarouselModule('#productCarousel', { 143 slidesInView: 5, 144 direction: "horizontal", 145 preloaderSize: 2, 146 showCounter: false 147 }); 148 }); 149 </script> 150 <div class="js-carousel-controls"></div> 151 </div> 152 </div> 153 </div> 154 </div> 155 </div> 156 <div class="grid__col-lg-auto grid__col-md-auto grid__col-sm-12 grid__col-xs-12 dw-mod" id="Block__MainInformation"> 157 <div> 158 <div class="u-pull--left product__title dw-mod"> 159 <h1 class="u-no-margin">@productName</h1> 160161 <div class="item-number dw-mod">@productNumber</div> 162 </div> 163164 @if (Pageview.User != null) 165 { 166 @RenderPartial("Designs/Rapido/eCom/ProductCatalog/Partials/ProductFavorite.cshtml", Model) 167 } 168169 </div> 170 <div class="grid__col-lg-12 grid__col-md-12 grid__col-sm-12 grid__col-xs-12 u-no-padding dw-mod" id="Block__FullDescription"> 171 <div class="product__section dw-mod"> 172 <div class="product__description center-container dw-mod"> 173 @{ 174 var desc = Convert.ToString(Model.LongDescription); 175 var orderItem = Convert.ToString(Model.ProductFields["OrderItem"].Value); 176177 if (!string.IsNullOrWhiteSpace(Convert.ToString(Model.ProductFields["Variantbeskrivning"].Value))) 178 { 179 desc = Convert.ToString(Model.ProductFields["Variantbeskrivning"].Value); 180 } 181 } 182183 @desc 184185 @if (orderItem.ToUpper() == "NEJ") 186 { 187 <div class=""> 188 @Translate("ORDER_ITEM_TEXT") 189 </div> 190 } 191192 @if (!string.IsNullOrWhiteSpace(uses)) 193 { 194 <p> 195 <h5>@Translate("SuitableFor")</h5> 196 <ul> 197 @foreach (var u in useValues) 198 { 199 <li>@Translate(u)</li> 200 } 201 </ul> 202 </p> 203 } 204205 <p></p> 206207 @RenderPartial("Designs/Rapido/eCom/ProductCatalog/Partials/ProductIcons.cshtml", Model) 208209 </div> 210 </div> 211 </div> 212213 @RenderPartial("Designs/Rapido/eCom/ProductCatalog/Partials/ProductBuyInfo.cshtml", Model) 214215 @if (Pageview.User?.ID == null) 216 { 217 <div class="product__price-actions-wrap dw-mod"></div> 218 } 219220 <div class=" u-no-padding--sm product__productsheet-wrapper"> 221 <a target="_blank" rel="nofollow" class="product__productsheet-download btn--condensed btn btn--primary dw-mod" title="@Translate("Ladda ner produktblad")" href="@productSheetLink"> 222 <div class="u-flex u-flex--align-items-center u-flex--align-center"><i class="fal fa-file-pdf u-margin-right--lg u-w20px"></i>@Translate("Ladda ner produktblad")</div> 223 </a> 224 </div> 225226 <script> 227 document.addEventListener("DOMContentLoaded", function () { 228 if (document.getElementById("PriceAndActions")) { 229 document.getElementById("PriceAndActions").addEventListener("contentLoaded", function (event) { 230 if (document.querySelector(".js-variants") != null) { 231 MatchVariants.Update(document.querySelector(".js-variants"), "DoNothing"); 232 } 233 }); 234 } 235 }); 236 </script> 237238 <script> 239 function addToSelectedCart() { 240 var requestUrl = "/Default.aspx?ID=6301" + "&cartcmd=Add&Quantity=1" + "&CartId=" + document.getElementById("CartSelector").value + "&ProductId=PROD433" + "&VariantId=VARGRP208_1000432" + "&UnitId="; 241242 console.log(requestUrl) 243244 document.getElementById('OrderDraftSelectModalTrigger').checked = false; 245246 var overlayElement = document.createElement('div'); 247 overlayElement.className = "preloader-overlay"; 248 overlayElement.setAttribute('id', "CartOverlay"); 249 var overlayElementIcon = document.createElement('div'); 250 overlayElementIcon.className = "preloader-overlay__icon dw-mod"; 251 overlayElementIcon.style.top = window.pageYOffset + "px"; 252 overlayElement.appendChild(overlayElementIcon); 253 document.getElementById('content').parentNode.insertBefore(overlayElement, document.getElementById('content')); 254255 Request.Fetch().get( 256 requestUrl, 257 function () { 258 var overlayNode = document.getElementById('CartOverlay'); 259 overlayNode.parentNode.removeChild(overlayNode); 260 document.getElementById('OrderDraftNotificationModalTrigger').checked = true; 261 }, 262 null, 263 false 264 ); 265 } 266267 function goToSelectedCart() { 268 window.location = "/Default.aspx?ID=" + "6562" + "&CartID=" + document.getElementById('CartSelector').value + "&CartCmd=setcart" + "&redirect=false"; 269 } 270 </script> 271 </div> 272 </div> 273 </div> 274 </div> 275276 @if (Pageview.Device.ToString() == "Mobile") 277 { 278 @RenderPartial("Designs/Rapido/eCom/ProductCatalog/Partials/TabsMobile.cshtml", Model) 279 } 280 else 281 { 282 @RenderPartial("Designs/Rapido/eCom/ProductCatalog/Partials/TabsDesktop.cshtml", Model) 283 } 284285 @{ 286 if (Model.RelatedGroups.Count > 0) 287 { 288 <div class="grid__col-lg-12 grid__col-md-12 grid__col-sm-12 grid__col-xs-12 u-no-padding dw-mod" id="Block__RelatedProducts"> 289 <div class="product__section dw-mod"> 290 <div class="center-container dw-mod"> 291 <h2 class=" dw-mod">@Translate("Related products")</h2> 292 <div class="grid js-product-scroll-trigger u-no-padding u-full-height" data-params=""> 293 @{ 294 foreach (var group in Model.RelatedGroups) 295 { 296 foreach (ProductInfoViewModel relatedProduct in group.Products) 297 { 298 var p = relatedProduct.GetProduct(); 299300 var productRelatedName = p.Name; 301 var productLink = p.GetProductLink(productPageId, true); 302 var productRelatedNumber = p.Number; 303 var raletedImgPath = "/Admin/Public/GetImage.ashx?width=325&height=241&crop=0&FillCanvas=True&DoNotUpscale=true&Compression=75&image=/Files/Images/produktbilder/" + p.Number + ".jpg"; 304 <div class="col-lg-3" style="margin-right:10px;"> 305 <div class="grid__cell product-list__grid-item__image dw-mod " style="margin-bottom:10px;"> 306 <a href="@productLink" onclick="" class="u-block u-position-relative image-hover__wrapper dw-mod"> 307 <img height="241" width="325" class="b-lazy grid__cell-img grid__cell-img--centered dw-mod b-loaded" src="@raletedImgPath" alt="@productRelatedName " title="@productRelatedName" /> 308309 </a> 310 </div> 311312 <div class="grid__cell dw-mod"> 313 <a href="@productLink" onclick="" title="@productRelatedName" class="u-color-inherit"> 314 <h6 class="u-condensed-text u-bold dw-mod">@productRelatedName</h6> 315 </a> 316317 <div class="item-number dw-mod">@productRelatedNumber</div> 318 <div class="price dw-mod">@p.Price.PriceWithoutVatFormatted</div> 319 <div class="before-price u-hidden dw-mod"></div> 320321 </div> 322 </div> 323 } 324 } 325 } 326327 </div> 328 </div> 329 </div> 330 </div> 331 } 332 } 333334 <script> 335 function toggleFavAction(button, event) { 336 if (button.getAttribute('data-add-link').indexOf('CCCreateNewList') > -1) { 337 Scroll.SavePosition(event); 338 location.href = button.getAttribute('data-add-link'); 339 return; 340 } 341 let isAdd = button.getAttribute('data-is-in-list') == "false"; 342 Request.Fetch().get( 343 isAdd ? button.getAttribute('data-add-link') : button.getAttribute('data-remove-link'), 344 function (result) { 345 button.querySelector('i').className = isAdd ? 'fas fa-star u-margin-right--lg' : 'fal fa-star u-margin-right--lg'; 346 button.setAttribute('data-is-in-list', isAdd); 347 button.setAttribute('title', (!isAdd ? 'Add to ' : 'Remove from ') + button.getAttribute('data-list-name')) 348 let favList = button.closest('.js-favorites-list'); 349 let favBtn = favList.querySelector('.js-favorite-btn i'); 350 let isInAnyFavoriteList = favList.querySelector('[data-is-in-list=true]') != null; 351 if (isInAnyFavoriteList) { 352 favBtn.className = 'fas fa-star' + ' fa-1_5x'; 353 } else { 354 favBtn.className = 'fal fa-star' + ' fa-1_5x'; 355 } 356 if (window.currentFavoriteListId != null) { //if this page is favorite list 357 let listId = button.getAttribute("data-list-id"); 358 if (listId == window.currentFavoriteListId && !isAdd) { 359 location.reload(); 360 } 361 } 362 }, 363 function () { 364 console.error("FavoriteLists: Error in ToggleFavAction request"); 365 }, 366 false 367 ); 368 } 369 </script> 370 </div> 371 </div> 372373 } 374375376 @functions{ 377378 public string GetFieldValue(FieldValueViewModel field) 379 { 380 var value = ""; 381 if (field.Value != null && field.Value is List<FieldOptionValueViewModel>) 382 { 383 var options = (List<FieldOptionValueViewModel>)field.Value; 384 value = string.Join(",", options.Select(x => x.Value)); 385 } 386 else 387 { 388 value = Dynamicweb.Core.Converter.ToString(field.Value); 389 } 390 return value; 391 } 392393 public string RenderIcon3(string value) 394 { 395 var iconPath = "/Files/Images/produktbilder/logotyper/"; 396 var iconFullPath = string.Empty; 397 var iconText = string.Empty; 398399 var values = value.Split(';'); 400401 iconFullPath = iconPath + values[0] + ".png"; 402 iconText = Translate(values[0]); 403404 var iconHtml = "<a href = '" + @values[1] + " target = '_blank' style = 'display:contents;' >"; 405 iconHtml += "<img width='40px' src = '" + iconFullPath + "' alt = '" + iconText + "' />"; 406 iconHtml += "</a>"; 407408 return iconHtml; 409410 } 411 } 412413 @helper RenderGoogleProductSchema() 414 { 415 var siteURL = Dynamicweb.Context.Current.Request.Url.Scheme + "://" + Dynamicweb.Context.Current.Request.Url.Host; 416 var image = Model.DefaultImage?.GetFileViewModel().PathUrlEncoded; 417 var brand = Convert.ToString(Model.ProductFields["brand"].Value); 418 var variantid = Model.VariantId; 419 var shopPageId = GetPageIdByNavigationTag("ProductsPage"); 420 var url = Dynamicweb.Context.Current.Request.Url.Scheme + "://" + Dynamicweb.Context.Current.Request.UserHostAddress + Model.GetProductLink(shopPageId, true); 421422 <script type="application/ld+json"> 423 { 424 "@@context": "http://schema.org/", 425 "@@type": "Product", 426 "name": "@Model.Name", 427 @if (!string.IsNullOrEmpty(image)) 428 { 429 <text>"image": [ 430 "@siteURL/Admin/Public/GetImage.ashx?width=400&height=400&crop=0&Compression=75&DoNotUpscale=true&image=@image", 431 "@siteURL/Admin/Public/GetImage.ashx?width=400&height=300&crop=0&Compression=75&DoNotUpscale=true&image=@image", 432 "@siteURL/Admin/Public/GetImage.ashx?width=448&height=225&crop=0&Compression=75&DoNotUpscale=true&image=@image" 433 ],</text> 434 } 435 "description": "@Model.ShortDescription", 436 "mpn": "925872", 437 @if (!string.IsNullOrEmpty(brand)) 438 { 439 <text>"brand": { 440 "@@type": "Thing", 441 "name": "@brand" 442 },</text> 443 } 444 "offers": { 445 "@@type": "Offer", 446 "priceCurrency": "@Model.Price.CurrencyCode", 447 "price": "@Model.Price.Price", 448 "availability": "@(Model.StockLevel > 0 ? "InStock" : "OutOfStock")", 449 "url": "@url" 450 } 451 } 452 </script> 453 }