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_840e5817b4434cb6b8d0c31162466b1f.Execute() in F:\sites\NevotexProd\WEB\Application\Files\Templates\Designs\Rapido\eCom\ProductCatalog\ProductDetailNevotex.cshtml:line 23
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 22 var currentGroup = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(groupId); 23 var rendera_4bilden = Convert.ToBoolean(currentGroup.ProductGroupFieldValues.GetProductGroupFieldValue("Rendera_4bilden").Value); 24 var renderFullImage = Convert.ToBoolean(currentGroup.ProductGroupFieldValues.GetProductGroupFieldValue("RenderFullImage").Value.ToString()); 25 var crop = currentGroup.ProductGroupFieldValues.GetProductGroupFieldValue("RenderFullImage").Value.ToString() == "collection" ? 0 : 5; 26 var productService = new ProductService(); 27 var path = Model.Number; 28 var productId = Model.Id; 29 var productName = Model.Name; 30 var productNumber = Model.Number; 31 var productVariantId = Model.VariantId; 32 var productLanguageId = Model.LanguageId; 33 var uses = productService.GetProductCategoryFieldValue("Anvndningsomrade", productId); 34 var useValues = uses.Split(','); 35 36 var productSheetPageId = GetPageIdByNavigationTag("ProductSheetNevotex"); 37 var mainProduct = Dynamicweb.Ecommerce.Services.Products.GetProductById(productId, null, false); 38 var encodedMainProductName = System.Web.HttpUtility.UrlEncode(mainProduct.Name); 39 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"; 40 41 if (rendera_4bilden) 42 { 43 path = path + "_4"; 44 } 45 46 if (renderFullImage) { 47 crop = 5; 48 } 49 50 IEnumerable<MediaViewModel> assetsImages = Model.AssetCategories.Where(x => x.SystemName == "Images").SelectMany(x => x.Assets); 51 List<MediaViewModel> assetsList = new List<MediaViewModel>(); 52 53 assetsList.Add(Model.DefaultImage); 54 55 foreach (MediaViewModel ai in assetsImages) 56 { 57 assetsList.Add(ai); 58 } 59 foreach (MediaViewModel ip in Model.ImagePatternImages) 60 { 61 assetsList.Add(ip); 62 } 63 64 var imgPath = $"/Admin/Public/GetImage.ashx?width=705&height=524&crop={crop}&FillCanvas=True&DoNotUpscale=true&Compression=75&image=/Files/Images/produktbilder/{path}.jpg"; 65 66 <div class="product__info dw-mod u-margin-bottom--lg js-product" data-renderfull-image="@renderFullImage"> 67 <div class="grid grid--align-content-start"> 68 69 <div class="product__top paragraph-container paragraph-container--full-width dw-mod"> 70 <div class="center-container dw-mod"> 71 <div class="grid"> 72 <div class="grid__col-lg-6 grid__col-md-6 grid__col-sm-12 grid__col-xs-12 dw-mod" id="Block__MainImage"> 73 <div class="grid grid--align-content-start dw-mod" id="Block__MainImageRow"> 74 <input type="checkbox" id="GalleryModalTrigger" class="modal-trigger"> 75 <div class="modal-container"> 76 <label for="GalleryModalTrigger" id="GalleryModalOverlay" class="modal-overlay"></label> 77 <div class="modal modal--lg modal-height--full" id="GalleryModal"> 78 <div class="modal__body "> 79 <div class="modal__body_text"></div> 80 <div class="carousel dw-mod carousel--horizontal" id="modalCarousel"> 81 <div class="thumb-list carousel__container js-carousel-slides dw-mod"> 82 @foreach (MediaViewModel img in assetsList) 83 { 84 var imagePath = img.GetFileViewModel().PathUrlEncoded; 85 var getImagePath = $"/Admin/Public/GetImage.ashx?width=1410&amp;height=1048&amp;crop={crop}&amp;FillCanvas=True&amp;DoNotUpscale=true&amp;Compression=75&amp;image={imagePath}&amp;AlternativeImage=/Images/missing_image.jpg"; 86 87 <div class="carousel__slide dw-mod carousel__slide--horizontal"> 88 <img class="b-lazy modal--full__img dw-mod" src="/Files/Images/placeholder.gif" data-src="@getImagePath" alt="@productName" title="@productName"> 89 </div> 90 } 91 92 </div> 93 94 <script> 95 document.addEventListener("DOMContentLoaded", function () { 96 modalCarousel = new CarouselModule('#modalCarousel', { 97 slidesInView: 1, 98 direction: "horizontal", 99 preloaderSize: 3, 100 showCounter: true 101 }); 102 }); 103 </script> 104 <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> 105 </div> 106107 </div> 108 <label class="modal__close-btn" for="GalleryModalTrigger"></label> 109 </div> 110 </div> 111 <div class="grid__col-lg-12 grid__col-md-12 grid__col-sm-12 grid__col-xs-12 dw-mod" id="Block__Image"> 112 <label for="GalleryModalTrigger" class="product__image-container u-position-relative"> 113 <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"> 114 </label> 115 </div> 116 <div class="grid__col-lg-12 grid__col-md-12 grid__col-sm-12 grid__col-xs-12 dw-mod" id="Block__Carousel"> 117 <div class="product__thumbs dw-mod"> 118 <div class="carousel dw-mod carousel--horizontal" id="productCarousel"> 119 <div class="thumb-list carousel__container js-carousel-slides dw-mod" style="left: 0px; width: 60%;"> 120121 @foreach (MediaViewModel img in assetsList) 122 { 123 var imagePath = img.GetFileViewModel().PathUrlEncoded; 124 var getImagePath = $"/Admin/Public/GetImage.ashx?width=705&amp;height=524&amp;crop={crop}&amp;FillCanvas=True&amp;DoNotUpscale=true&amp;Compression=75&amp;image={imagePath}"; 125 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"; 126127 <div class="carousel__slide dw-mod carousel__slide--horizontal"> 128 <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)"> 129 <label for="GalleryModalTrigger" class="thumb-list__image-label"> 130 <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"> 131132 </label> 133 </div> 134 </div> 135 } 136 </div> 137138 <script> 139 document.addEventListener("DOMContentLoaded", function () { 140 productCarousel = new CarouselModule('#productCarousel', { 141 slidesInView: 5, 142 direction: "horizontal", 143 preloaderSize: 2, 144 showCounter: false 145 }); 146 }); 147 </script> 148 <div class="js-carousel-controls"></div> 149 </div> 150 </div> 151 </div> 152 </div> 153 </div> 154 <div class="grid__col-lg-auto grid__col-md-auto grid__col-sm-12 grid__col-xs-12 dw-mod" id="Block__MainInformation"> 155 <div> 156 <div class="u-pull--left product__title dw-mod"> 157 <h1 class="u-no-margin">@productName</h1> 158159 <div class="item-number dw-mod">@productNumber</div> 160 </div> 161162 @if (Pageview.User != null) 163 { 164 @RenderPartial("Designs/Rapido/eCom/ProductCatalog/Partials/ProductFavorite.cshtml", Model) 165 } 166167 </div> 168 <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"> 169 <div class="product__section dw-mod"> 170 <div class="product__description center-container dw-mod"> 171 @{ 172 var desc = Convert.ToString(Model.LongDescription); 173 var orderItem = Convert.ToString(Model.ProductFields["OrderItem"].Value); 174175 if (!string.IsNullOrWhiteSpace(Convert.ToString(Model.ProductFields["Variantbeskrivning"].Value))) 176 { 177 desc = Convert.ToString(Model.ProductFields["Variantbeskrivning"].Value); 178 } 179 } 180181 @desc 182183 @if (orderItem.ToUpper() == "NEJ") 184 { 185 <div class=""> 186 @Translate("ORDER_ITEM_TEXT") 187 </div> 188 } 189190 @if (!string.IsNullOrWhiteSpace(uses)) 191 { 192 <p> 193 <h5>@Translate("SuitableFor")</h5> 194 <ul> 195 @foreach (var u in useValues) 196 { 197 <li>@Translate(u)</li> 198 } 199 </ul> 200 </p> 201 } 202203 <p></p> 204205 @RenderPartial("Designs/Rapido/eCom/ProductCatalog/Partials/ProductIcons.cshtml", Model) 206207 </div> 208 </div> 209 </div> 210211 @RenderPartial("Designs/Rapido/eCom/ProductCatalog/Partials/ProductBuyInfo.cshtml", Model) 212213 @if (Pageview.User?.ID == null) 214 { 215 <div class="product__price-actions-wrap dw-mod"></div> 216 } 217218 <div class=" u-no-padding--sm product__productsheet-wrapper"> 219 <a target="_blank" rel="nofollow" class="product__productsheet-download btn--condensed btn btn--primary dw-mod" title="@Translate("Ladda ner produktblad")" href="@productSheetLink"> 220 <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> 221 </a> 222 </div> 223224 <script> 225 document.addEventListener("DOMContentLoaded", function () { 226 if (document.getElementById("PriceAndActions")) { 227 document.getElementById("PriceAndActions").addEventListener("contentLoaded", function (event) { 228 if (document.querySelector(".js-variants") != null) { 229 MatchVariants.Update(document.querySelector(".js-variants"), "DoNothing"); 230 } 231 }); 232 } 233 }); 234 </script> 235236 <script> 237 function addToSelectedCart() { 238 var requestUrl = "/Default.aspx?ID=6301" + "&cartcmd=Add&Quantity=1" + "&CartId=" + document.getElementById("CartSelector").value + "&ProductId=PROD433" + "&VariantId=VARGRP208_1000432" + "&UnitId="; 239240 console.log(requestUrl) 241242 document.getElementById('OrderDraftSelectModalTrigger').checked = false; 243244 var overlayElement = document.createElement('div'); 245 overlayElement.className = "preloader-overlay"; 246 overlayElement.setAttribute('id', "CartOverlay"); 247 var overlayElementIcon = document.createElement('div'); 248 overlayElementIcon.className = "preloader-overlay__icon dw-mod"; 249 overlayElementIcon.style.top = window.pageYOffset + "px"; 250 overlayElement.appendChild(overlayElementIcon); 251 document.getElementById('content').parentNode.insertBefore(overlayElement, document.getElementById('content')); 252253 Request.Fetch().get( 254 requestUrl, 255 function () { 256 var overlayNode = document.getElementById('CartOverlay'); 257 overlayNode.parentNode.removeChild(overlayNode); 258 document.getElementById('OrderDraftNotificationModalTrigger').checked = true; 259 }, 260 null, 261 false 262 ); 263 } 264265 function goToSelectedCart() { 266 window.location = "/Default.aspx?ID=" + "6562" + "&CartID=" + document.getElementById('CartSelector').value + "&CartCmd=setcart" + "&redirect=false"; 267 } 268 </script> 269 </div> 270 </div> 271 </div> 272 </div> 273274 @if (Pageview.Device.ToString() == "Mobile") 275 { 276 @RenderPartial("Designs/Rapido/eCom/ProductCatalog/Partials/TabsMobile.cshtml", Model) 277 } 278 else 279 { 280 @RenderPartial("Designs/Rapido/eCom/ProductCatalog/Partials/TabsDesktop.cshtml", Model) 281 } 282283 @{ 284 if (Model.RelatedGroups.Count > 0) 285 { 286 <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"> 287 <div class="product__section dw-mod"> 288 <div class="center-container dw-mod"> 289 <h2 class=" dw-mod">@Translate("Related products")</h2> 290 <div class="grid js-product-scroll-trigger u-no-padding u-full-height" data-params=""> 291 @{ 292 foreach (var group in Model.RelatedGroups) 293 { 294 foreach (ProductInfoViewModel relatedProduct in group.Products) 295 { 296 var p = relatedProduct.GetProduct(); 297298 var productRelatedName = p.Name; 299 var productLink = p.GetProductLink(productPageId, true); 300 var productRelatedNumber = p.Number; 301 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"; 302 <div class="col-lg-3" style="margin-right:10px;"> 303 <div class="grid__cell product-list__grid-item__image dw-mod " style="margin-bottom:10px;"> 304 <a href="@productLink" onclick="" class="u-block u-position-relative image-hover__wrapper dw-mod"> 305 <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" /> 306307 </a> 308 </div> 309310 <div class="grid__cell dw-mod"> 311 <a href="@productLink" onclick="" title="@productRelatedName" class="u-color-inherit"> 312 <h6 class="u-condensed-text u-bold dw-mod">@productRelatedName</h6> 313 </a> 314315 <div class="item-number dw-mod">@productRelatedNumber</div> 316 <div class="price dw-mod">@p.Price.PriceWithoutVatFormatted</div> 317 <div class="before-price u-hidden dw-mod"></div> 318319 </div> 320 </div> 321322323324325 } 326 } 327 } 328329 </div> 330 </div> 331 </div> 332 </div> 333 } 334 } 335336337338339 <script> 340 function toggleFavAction(button, event) { 341 if (button.getAttribute('data-add-link').indexOf('CCCreateNewList') > -1) { 342 Scroll.SavePosition(event); 343 location.href = button.getAttribute('data-add-link'); 344 return; 345 } 346 let isAdd = button.getAttribute('data-is-in-list') == "false"; 347 Request.Fetch().get( 348 isAdd ? button.getAttribute('data-add-link') : button.getAttribute('data-remove-link'), 349 function (result) { 350 button.querySelector('i').className = isAdd ? 'fas fa-star u-margin-right--lg' : 'fal fa-star u-margin-right--lg'; 351 button.setAttribute('data-is-in-list', isAdd); 352 button.setAttribute('title', (!isAdd ? 'Add to ' : 'Remove from ') + button.getAttribute('data-list-name')) 353 let favList = button.closest('.js-favorites-list'); 354 let favBtn = favList.querySelector('.js-favorite-btn i'); 355 let isInAnyFavoriteList = favList.querySelector('[data-is-in-list=true]') != null; 356 if (isInAnyFavoriteList) { 357 favBtn.className = 'fas fa-star' + ' fa-1_5x'; 358 } else { 359 favBtn.className = 'fal fa-star' + ' fa-1_5x'; 360 } 361 if (window.currentFavoriteListId != null) { //if this page is favorite list 362 let listId = button.getAttribute("data-list-id"); 363 if (listId == window.currentFavoriteListId && !isAdd) { 364 location.reload(); 365 } 366 } 367 }, 368 function () { 369 console.error("FavoriteLists: Error in ToggleFavAction request"); 370 }, 371 false 372 ); 373 } 374 </script> 375 </div> 376 </div> 377378 } 379380381 @functions{ 382383 public string GetFieldValue(FieldValueViewModel field) 384 { 385 var value = ""; 386 if (field.Value != null && field.Value is List<FieldOptionValueViewModel>) 387 { 388 var options = (List<FieldOptionValueViewModel>)field.Value; 389 value = string.Join(",", options.Select(x => x.Value)); 390 } 391 else 392 { 393 value = Dynamicweb.Core.Converter.ToString(field.Value); 394 } 395 return value; 396 } 397398 public string RenderIcon3(string value) 399 { 400 var iconPath = "/Files/Images/produktbilder/logotyper/"; 401 var iconFullPath = string.Empty; 402 var iconText = string.Empty; 403404 var values = value.Split(';'); 405406 iconFullPath = iconPath + values[0] + ".png"; 407 iconText = Translate(values[0]); 408409 var iconHtml = "<a href = '" + @values[1] + " target = '_blank' style = 'display:contents;' >"; 410 iconHtml += "<img width='40px' src = '" + iconFullPath + "' alt = '" + iconText + "' />"; 411 iconHtml += "</a>"; 412413 return iconHtml; 414415 } 416 } 417418 @helper RenderGoogleProductSchema() 419 { 420 var siteURL = Dynamicweb.Context.Current.Request.Url.Scheme + "://" + Dynamicweb.Context.Current.Request.Url.Host; 421 var image = Model.DefaultImage?.GetFileViewModel().PathUrlEncoded; 422 var brand = Convert.ToString(Model.ProductFields["brand"].Value); 423 var variantid = Model.VariantId; 424 var shopPageId = GetPageIdByNavigationTag("ProductsPage"); 425 var url = Dynamicweb.Context.Current.Request.Url.Scheme + "://" + Dynamicweb.Context.Current.Request.UserHostAddress + Model.GetProductLink(shopPageId, true); 426427 <script type="application/ld+json"> 428 { 429 "@@context": "http://schema.org/", 430 "@@type": "Product", 431 "name": "@Model.Name", 432 @if (!string.IsNullOrEmpty(image)) 433 { 434 <text>"image": [ 435 "@siteURL/Admin/Public/GetImage.ashx?width=400&height=400&crop=0&Compression=75&DoNotUpscale=true&image=@image", 436 "@siteURL/Admin/Public/GetImage.ashx?width=400&height=300&crop=0&Compression=75&DoNotUpscale=true&image=@image", 437 "@siteURL/Admin/Public/GetImage.ashx?width=448&height=225&crop=0&Compression=75&DoNotUpscale=true&image=@image" 438 ],</text> 439 } 440 "description": "@Model.ShortDescription", 441 "mpn": "925872", 442 @if (!string.IsNullOrEmpty(brand)) 443 { 444 <text>"brand": { 445 "@@type": "Thing", 446 "name": "@brand" 447 },</text> 448 } 449 "offers": { 450 "@@type": "Offer", 451 "priceCurrency": "@Model.Price.CurrencyCode", 452 "price": "@Model.Price.Price", 453 "availability": "@(Model.StockLevel > 0 ? "InStock" : "OutOfStock")", 454 "url": "@url" 455 } 456 } 457 </script> 458 }