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_611da1a2fe494fa895367c94c59979cd.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); 173174 if (!string.IsNullOrWhiteSpace(Convert.ToString(Model.ProductFields["Variantbeskrivning"].Value))) 175 { 176 desc = Convert.ToString(Model.ProductFields["Variantbeskrivning"].Value); 177 } 178 } 179180 @desc 181182 @if (!string.IsNullOrWhiteSpace(uses)) 183 { 184 <p> 185 <h5>@Translate("SuitableFor")</h5> 186 <ul> 187 @foreach (var u in useValues) 188 { 189 <li>@Translate(u)</li> 190 } 191 </ul> 192 </p> 193 } 194195 <p></p> 196197 @RenderPartial("Designs/Rapido/eCom/ProductCatalog/Partials/ProductIcons.cshtml", Model) 198199 </div> 200 </div> 201 </div> 202203 @RenderPartial("Designs/Rapido/eCom/ProductCatalog/Partials/ProductBuyInfo.cshtml", Model) 204205 @if (Pageview.User?.ID == null) 206 { 207 <div class="product__price-actions-wrap dw-mod"></div> 208 } 209210 <div class=" u-no-padding--sm product__productsheet-wrapper"> 211 <a target="_blank" rel="nofollow" class="product__productsheet-download btn--condensed btn btn--primary dw-mod" title="@Translate("Ladda ner produktblad")" href="@productSheetLink"> 212 <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> 213 </a> 214 </div> 215216 <script> 217 document.addEventListener("DOMContentLoaded", function () { 218 if (document.getElementById("PriceAndActions")) { 219 document.getElementById("PriceAndActions").addEventListener("contentLoaded", function (event) { 220 if (document.querySelector(".js-variants") != null) { 221 MatchVariants.Update(document.querySelector(".js-variants"), "DoNothing"); 222 } 223 }); 224 } 225 }); 226 </script> 227228 <script> 229 function addToSelectedCart() { 230 var requestUrl = "/Default.aspx?ID=6301" + "&cartcmd=Add&Quantity=1" + "&CartId=" + document.getElementById("CartSelector").value + "&ProductId=PROD433" + "&VariantId=VARGRP208_1000432" + "&UnitId="; 231232 console.log(requestUrl) 233234 document.getElementById('OrderDraftSelectModalTrigger').checked = false; 235236 var overlayElement = document.createElement('div'); 237 overlayElement.className = "preloader-overlay"; 238 overlayElement.setAttribute('id', "CartOverlay"); 239 var overlayElementIcon = document.createElement('div'); 240 overlayElementIcon.className = "preloader-overlay__icon dw-mod"; 241 overlayElementIcon.style.top = window.pageYOffset + "px"; 242 overlayElement.appendChild(overlayElementIcon); 243 document.getElementById('content').parentNode.insertBefore(overlayElement, document.getElementById('content')); 244245 Request.Fetch().get( 246 requestUrl, 247 function () { 248 var overlayNode = document.getElementById('CartOverlay'); 249 overlayNode.parentNode.removeChild(overlayNode); 250 document.getElementById('OrderDraftNotificationModalTrigger').checked = true; 251 }, 252 null, 253 false 254 ); 255 } 256257 function goToSelectedCart() { 258 window.location = "/Default.aspx?ID=" + "6562" + "&CartID=" + document.getElementById('CartSelector').value + "&CartCmd=setcart" + "&redirect=false"; 259 } 260 </script> 261 </div> 262 </div> 263 </div> 264 </div> 265266 @if (Pageview.Device.ToString() == "Mobile") 267 { 268 @RenderPartial("Designs/Rapido/eCom/ProductCatalog/Partials/TabsMobile.cshtml", Model) 269 } 270 else 271 { 272 @RenderPartial("Designs/Rapido/eCom/ProductCatalog/Partials/TabsDesktop.cshtml", Model) 273 } 274275 @{ 276 if (Model.RelatedGroups.Count > 0) 277 { 278 <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"> 279 <div class="product__section dw-mod"> 280 <div class="center-container dw-mod"> 281 <h2 class=" dw-mod">@Translate("Related products")</h2> 282 <div> 283 <div class="u-min-h400px u-full-width"> 284 <div class="grid"> 285 <div class="grid__col-45px grid__col--bleed-x"> 286 <div class="grid__cell grid__cell--align-middle-left"> 287 <button class="btn--condensed u-hidden u-position-relative dw-mod" onclick="" type="button" ="u-hidden" =""> 288 <i class="fas fa-chevron-left fa-2x u-flex--align-center"></i> 289 </button> 290 </div> 291 </div> 292 <div class="grid__col-auto grid__col--bleed-x"> 293 <div id="ProductsContainer" data-template="ProductGridItemContainer" class="grid product-list dw-mod" data-save-cookie="true"> 294 <div id="Product" class="grid__col-3 product-list__grid-item image-hover--zoom dw-mod"> 295 <div class="grid__col--auto js-product-scroll-trigger u-no-padding u-full-height" data-params=""> 296 @{ 297 foreach (var group in Model.RelatedGroups) 298 { 299 foreach (ProductInfoViewModel relatedProduct in group.Products) 300 { 301 var p = relatedProduct.GetProduct(); 302303 var productRelatedName = p.Name; 304 var productLink = p.GetProductLink(productPageId, true); 305 var productRelatedNumber = p.Number; 306 var raletedImgPath = "/Admin/Public/GetImage.ashx?width=705&height=524&crop=0&FillCanvas=True&DoNotUpscale=true&Compression=75&image=/Files/Images/produktbilder/" + p.Number + ".jpg"; 307308309 <div class="grid__col--auto js-product-scroll-trigger u-no-padding u-full-height" data-params=""> 310 <div class="grid__cell product-list__grid-item__image dw-mod "> 311 <a href="@productLink" onclick="" class="u-block u-position-relative image-hover__wrapper dw-mod"> 312 <img class="b-lazy grid__cell-img grid__cell-img--centered u-min-h180px dw-mod b-loaded" src="@raletedImgPath" alt="@productRelatedName " title="@productRelatedName" /> 313314 </a> 315 </div> 316317 <div class="grid__cell product-list__grid-item__price-info dw-mod"> 318 <a href="@productLink" onclick="" title="@productRelatedName" class="u-color-inherit"> 319 <h6 class="u-condensed-text u-bold dw-mod">@productRelatedName</h6> 320 </a> 321322 <div class="item-number dw-mod">@productRelatedNumber</div> 323 <div class="price price--product-list dw-mod">@p.Price.PriceWithoutVatFormatted</div> 324 <div class="before-price u-hidden dw-mod"></div> 325326 </div> 327328 <div class="product-list__grid-item__footer dw-mod"> 329 </div> 330 </div> 331332 } 333 } 334 } 335336 <div class="product-list__grid-item__footer dw-mod"> 337 </div> 338 </div> 339 </div> 340 </div> 341 </div> 342 <div class="grid__col-45px grid__col--bleed-x"> 343 <div class="grid__cell grid__cell--align-middle-right"> 344 <button class="btn--condensed u-hidden u-position-relative dw-mod" onclick="HandlebarsBolt.UpdateContent('ProductList_RelatedProducts', '')" type="button" ="u-hidden" =""> 345 <i class="fas fa-chevron-right fa-2x u-flex--align-center"></i> 346 </button> 347 </div> 348 </div> 349 </div> 350 </div> 351 </div> 352 </div> 353 </div> 354 </div> 355 } 356 } 357358359360361 <script> 362 function toggleFavAction(button, event) { 363 if (button.getAttribute('data-add-link').indexOf('CCCreateNewList') > -1) { 364 Scroll.SavePosition(event); 365 location.href = button.getAttribute('data-add-link'); 366 return; 367 } 368 let isAdd = button.getAttribute('data-is-in-list') == "false"; 369 Request.Fetch().get( 370 isAdd ? button.getAttribute('data-add-link') : button.getAttribute('data-remove-link'), 371 function (result) { 372 button.querySelector('i').className = isAdd ? 'fas fa-star u-margin-right--lg' : 'fal fa-star u-margin-right--lg'; 373 button.setAttribute('data-is-in-list', isAdd); 374 button.setAttribute('title', (!isAdd ? 'Add to ' : 'Remove from ') + button.getAttribute('data-list-name')) 375 let favList = button.closest('.js-favorites-list'); 376 let favBtn = favList.querySelector('.js-favorite-btn i'); 377 let isInAnyFavoriteList = favList.querySelector('[data-is-in-list=true]') != null; 378 if (isInAnyFavoriteList) { 379 favBtn.className = 'fas fa-star' + ' fa-1_5x'; 380 } else { 381 favBtn.className = 'fal fa-star' + ' fa-1_5x'; 382 } 383 if (window.currentFavoriteListId != null) { //if this page is favorite list 384 let listId = button.getAttribute("data-list-id"); 385 if (listId == window.currentFavoriteListId && !isAdd) { 386 location.reload(); 387 } 388 } 389 }, 390 function () { 391 console.error("FavoriteLists: Error in ToggleFavAction request"); 392 }, 393 false 394 ); 395 } 396 </script> 397 </div> 398 </div> 399400 } 401402403 @functions{ 404405 public string GetFieldValue(FieldValueViewModel field) 406 { 407 var value = ""; 408 if (field.Value != null && field.Value is List<FieldOptionValueViewModel>) 409 { 410 var options = (List<FieldOptionValueViewModel>)field.Value; 411 value = string.Join(",", options.Select(x => x.Value)); 412 } 413 else 414 { 415 value = Dynamicweb.Core.Converter.ToString(field.Value); 416 } 417 return value; 418 } 419420 public string RenderIcon3(string value) 421 { 422 var iconPath = "/Files/Images/produktbilder/logotyper/"; 423 var iconFullPath = string.Empty; 424 var iconText = string.Empty; 425426 var values = value.Split(';'); 427428 iconFullPath = iconPath + values[0] + ".png"; 429 iconText = Translate(values[0]); 430431 var iconHtml = "<a href = '" + @values[1] + " target = '_blank' style = 'display:contents;' >"; 432 iconHtml += "<img width='40px' src = '" + iconFullPath + "' alt = '" + iconText + "' />"; 433 iconHtml += "</a>"; 434435 return iconHtml; 436437 } 438 } 439440 @helper RenderGoogleProductSchema() 441 { 442 var siteURL = Dynamicweb.Context.Current.Request.Url.Scheme + "://" + Dynamicweb.Context.Current.Request.Url.Host; 443 var image = Model.DefaultImage?.GetFileViewModel().PathUrlEncoded; 444 var brand = Convert.ToString(Model.ProductFields["brand"].Value); 445 var variantid = Model.VariantId; 446 var shopPageId = GetPageIdByNavigationTag("ProductsPage"); 447 var url = Dynamicweb.Context.Current.Request.Url.Scheme + "://" + Dynamicweb.Context.Current.Request.UserHostAddress + Model.GetProductLink(shopPageId, true); 448449 <script type="application/ld+json"> 450 { 451 "@@context": "http://schema.org/", 452 "@@type": "Product", 453 "name": "@Model.Name", 454 @if (!string.IsNullOrEmpty(image)) 455 { 456 <text>"image": [ 457 "@siteURL/Admin/Public/GetImage.ashx?width=400&height=400&crop=0&Compression=75&DoNotUpscale=true&image=@image", 458 "@siteURL/Admin/Public/GetImage.ashx?width=400&height=300&crop=0&Compression=75&DoNotUpscale=true&image=@image", 459 "@siteURL/Admin/Public/GetImage.ashx?width=448&height=225&crop=0&Compression=75&DoNotUpscale=true&image=@image" 460 ],</text> 461 } 462 "description": "@Model.ShortDescription", 463 "mpn": "925872", 464 @if (!string.IsNullOrEmpty(brand)) 465 { 466 <text>"brand": { 467 "@@type": "Thing", 468 "name": "@brand" 469 },</text> 470 } 471 "offers": { 472 "@@type": "Offer", 473 "priceCurrency": "@Model.Price.CurrencyCode", 474 "price": "@Model.Price.Price", 475 "availability": "@(Model.StockLevel > 0 ? "InStock" : "OutOfStock")", 476 "url": "@url" 477 } 478 } 479 </script> 480 }