Error executing template "Designs/Rapido/eCom/ProductCatalog/Partials/ProductList.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
at CompiledRazorTemplates.Dynamic.RazorEngine_1b766c30808e47a293a1b72de5f89228.Execute() in E:\wwwroot\nevotex\Files\Templates\Designs\Rapido\eCom\ProductCatalog\Partials\ProductList.cshtml:line 195
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 @inherits ViewModelTemplate<ProductListViewModel> 2 @using Dynamicweb.Rendering 3 @using Dynamicweb.Ecommerce.ProductCatalog 4 @using Dynamicweb.Ecommerce; 5 @using System.Collections.Generic; 6 @using System.Web; 7 @using System.Linq; 8 @using Nevotex.Data.Cache 9 @using Nevotex.Data.Entities 10 @using Nevotex.Data.Helpers 11 @using Nevotex.Data.Services 12 13 @{ 14 var productServiceForProductList = new ProductService(); 15 var isCollection = productServiceForProductList.IsGroupACollection(Model.Group.Id, Pageview.Area.EcomLanguageId); 16 var shopPageId = GetPageIdByNavigationTag("ProductsPage"); 17 var columnCss = isCollection ? "2" : "3"; 18 var displayCss = isCollection ? "u-hidden" : ""; 19 var cropMode = isCollection ? "0" : "5"; 20 var paddingFix = isCollection ? "product-list__grid-item__collection-price-info" : string.Empty; 21 var imageBorder = isCollection ? "product-list__grid-item__no_border" : "product-list__grid-item__border"; 22 var hideArticleNumberCss = isCollection ? "u-hidden collection-item" : string.Empty; 23 var groupId = Model.Group.Id; 24 var rendera_4 = Convert.ToBoolean(Model.Group.GroupFields.FirstOrDefault(f => f.SystemName == "Rendera_4bilden")?.Value); 25 var gridCSS = "grid__col-lg-3 grid__col-md-3 grid__col-sm-3 grid__col-xs-6 product-list__grid-item image-hover--zoom dw-mod"; 26 } 27 28 <!--HEADER--> 29 <div class="grid grid--align-content-start grid--justify-start grid--bleed u-margin-bottom--lg u-padding grid--wrap u-flex-grow--0 dw-mod"> 30 <div class="grid "> 31 <div class="u-pull--left"> 32 <h1><i class=""></i>@Model.Group.Name</h1> 33 </div> 34 <div class="grid__col-xs-12 grid__col-md-6 dw-mod"> 35 </div> 36 </div> 37 </div> 38 39 <!--FACETS--> 40 <div class="grid__col-lg-3 grid__col-md-3 grid__col-sm-12 grid__col-xs-12 dw-mod" id="Block__Navigation"> 41 <input type="checkbox" id="CheckFacetGroups" class="js-remember-state u-hidden" data-expand="CheckFacetGroups" data-loaded="true"> 42 <div class="facets-container facets-container--left expandable--collapsed dw-mod" data-trigger="CheckFacetGroups"> 43 44 @{ 45 bool facetsFound = false; 46 int selectedFacetsCount = 0; 47 48 49 if (Model.FacetGroups != null) 50 { 51 foreach (FacetGroupViewModel facetGroup in Model.FacetGroups) 52 { 53 54 foreach (FacetViewModel facet in facetGroup.Facets) 55 { 56 if (facet.OptionResultTotalCount > 0) 57 { 58 var optionGroupId = $"OptionsGroup_{facet.Name}"; 59 60 <input type="checkbox" id="@optionGroupId" class="expand-trigger js-remember-state" data-loaded="true" /> 61 62 <div class="expand-container facets-container__box dw-mod js-filter"> 63 <label class="expand-container__btn facets-container__header dw-mod" for="@optionGroupId">@Translate(facet.Name)</label> 64 <div class="expand-container__content js-facet-container dw-mod" data-input="@optionGroupId"> 65 66 @if (facet.Options.Count() > 0) 67 { 68 var faceListId = $"facetList{facet.Name}"; 69 70 facetsFound = true; 71 72 <div id="@faceListId" class="facets-container__list dw-mod"> 73 @foreach (FacetOptionViewModel option in facet.Options) 74 { 75 var facetOptionId = $"{facet.QueryParameter}{option.Name}"; 76 var selected = string.Empty; 77 string facetLabel = Translate(option.Label); 78 79 if (facetLabel.ToLower() == "true") 80 { 81 facetLabel = Translate("Yes"); 82 } 83 84 if (facetLabel.ToLower() == "false") 85 { 86 facetLabel = Translate("No"); 87 } 88 89 if (option.Selected) 90 { 91 selected = "checked"; 92 selectedFacetsCount++; 93 } 94 95 if (facet.RenderType != "Range" && facet.Name != "Bredd") 96 { 97 <div class="form__field-group u-no-margin dw-mod"> 98 <input type="checkbox" class=" checkbox-facet__checkbox form__control dw-mod" onclick="Facets.UpdateFacets(this);" id="@facetOptionId" @selected name="@facet.QueryParameter" value="[@option.Label]" /> 99 <label class=" checkbox-facet dw-mod" data-filter-value="@facetLabel" for="@facetOptionId"> 100 <span class="checkbox-facet__label dw-mod">@facetLabel</span> 101 @if (isCollection) 102 { 103 <span class="checkbox-facet__count dw-mod">(@option.Count)</span> 104 } 105106 </label> 107 </div> 108 } 109 else if (facet.Name == "Bredd") 110 { 111112 } 113114115116117 } 118 </div> 119 } 120121 </div> 122 </div> 123 } 124125126 } 127 } 128129 } 130 } 131132 </div> 133 </div> 134135 <label for="CheckFacetGroups" class="btn btn--primary btn--full u-no-margin dw-mod js-expand-hide facets-container-trigger" data-trigger="CheckFacetGroups">Filtrera</label> 136 <label for="CheckFacetGroups" class="btn btn--primary btn--full u-no-margin dw-mod expandable--collapsed facets-container-trigger" data-trigger="CheckFacetGroups">Stäng filter</label> 137138 <!--PRODUCTLIST COLLECTION--> 139140 <div class="grid__col-auto"> 141142 <div class="buttons-collection u-margin-bottom" id="selectedFacets"> 143144 @foreach (FacetGroupViewModel faceGroup in Model.FacetGroups) 145 { 146 foreach (FacetViewModel facet in faceGroup.Facets) 147 { 148 if (facet.OptionResultTotalCount > 0) 149 { 150 foreach (FacetOptionViewModel option in facet.Options) 151 { 152 if (option.Selected) 153 { 154 <button type="button" class="btn btn--tag dw-mod" data-check="checked" onclick="Facets.UpdateFacets(this);" name="@facet.QueryParameter" value="@option.Value" title="@Translate("Remove filter")"> 155 @Translate(facet.Name) : @Translate(option.Label) &nbsp;<i class="fal fa-times"></i> 156 </button> 157 } 158 } 159 } 160 } 161 } 162163 </div> 164165 <div id="ProductsContainer" class="grid product-list grid--external-bleed-x dw-mod grid--align-content-start" data-save-cookie="true"> 166167 @foreach (ProductViewModel product in Model.Products) 168 { 169170 var productName = product.Name; 171 var productId = product.Id; 172 var productVariantId = product.VariantId; 173 var productUnit = product.DefaultUnitId; 174 var uniqueId = Guid.NewGuid().ToString("N"); 175 var productLoopCounter = $"ProductLoopCounter{uniqueId}"; 176 var productLoopId = $"ProductID{uniqueId}"; 177 var variantLoopName = $"VariantID{uniqueId}"; 178 var variantLoopId = $"Variant_{uniqueId}"; 179 var unitLoopName = $"UnitID{uniqueId}"; 180 var unitLoopId = $"Unit_{uniqueId}"; 181 var quantityLoopName = $"Quantity{uniqueId}"; 182 var quantityLoopId = $"Quantity_{uniqueId}"; 183 var cartButtonId = $"CartButton_{uniqueId}"; 184 var productImagePath = product.DefaultImage.GetFileViewModel().PathUrlEncoded; 185 var imagePath = $"/Admin/Public/GetImage.ashx?format=webp&width=300&amp;height=300&amp;crop=0&amp;Compression=75&amp;FillCanvas=true&amp;DoNotUpscale=true&amp;image={productImagePath}"; 186 var productLink = product.GetProductLink(shopPageId, false); 187 var collectionData = Convert.ToString(product.ProductFields["ProductNumbersInCollection"].Value); 188189190 if (isCollection && !string.IsNullOrWhiteSpace(collectionData)) 191 { 192 gridCSS = "grid__col-lg-2 grid__col-md-2 grid__col-sm-2 grid__col-xs-6 product-list__grid-item image-hover--zoom dw-mod"; 193 var randomProduct = GetRandomProduct(collectionData, rendera_4); 194195 productLink = $"/Default.aspx?ID={shopPageId}&GroupId={groupId}&ProductId={productId}&VariantID={randomProduct.VariantId}"; 196 imagePath = $"/Admin/Public/GetImage.ashx?format=webp&width=300&amp;height=300&amp;crop=0&amp;Compression=75&amp;FillCanvas=true&amp;DoNotUpscale=true&amp;image={randomProduct.Image}"; 197198 } 199 else 200 { 201 imagePath = $"/Admin/Public/GetImage.ashx?format=webp&width=300&amp;height=300&amp;crop=0&amp;Compression=75&amp;FillCanvas=true&amp;DoNotUpscale=true&amp;image={productImagePath}"; 202 productLink = $"/Default.aspx?ID={shopPageId}&GroupId={groupId}&ProductId={productId}"; 203204 if (!string.IsNullOrWhiteSpace(productVariantId)) 205 { 206 productLink += $"&VariantID={productVariantId}"; 207 } 208 } 209210 <div id="Product" class="@gridCSS"> 211212 <div class="grid__col--auto js-product-scroll-trigger u-no-padding u-full-height" data-params=""> 213 <input type="hidden" name="@productLoopCounter" value="@uniqueId"> 214 <input type="hidden" name="@productLoopId" value="@productId"> 215 <input type="hidden" name="@variantLoopId" value="@productVariantId" id="@variantLoopId"> 216 <input type="hidden" name="@unitLoopName" value="@productUnit" id="@unitLoopId"> 217 <input type="hidden" name="@quantityLoopName" value="1" id="@quantityLoopId"> 218 <div class="grid__cell product-list__grid-item__image dw-mod "> 219 <a href="@productLink" onclick="" title="@productName" class="u-block u-position-relative image-hover__wrapper dw-mod"> 220 <img width="168" height="168" class="grid__cell-img grid__cell-img--centered b-lazy b-loaded" src="@imagePath" alt="@productName"> 221 </a> 222 <div class="favorites favorites--for-grid-view u-pull--right dw-mod"> 223 </div> 224225 </div> 226 <div class="grid__cell product-list__grid-item__price-info dw-mod collection-item "> 227 <a href="@productLink" class="u-color-inherit" onclick="" title="@productName"> 228 <h6 class=" u-bold">@productName</h6> 229 </a> 230231 @if (!isCollection) 232 { 233 <p class="u-margin-top"></p> 234 <div class="item-number dw-mod @displayCss @hideArticleNumberCss ">@Translate("ArtNr", "Art. nr"): @product.Number </div> 235236237 if (Dynamicweb.Frontend.PageView.Current().Device != Dynamicweb.Frontend.Devices.DeviceType.Mobile) 238 { 239 // login to see price 240 bool userLoggedIn = Dynamicweb.Security.UserManagement.User.IsExtranetUserLoggedIn(); 241242 if (userLoggedIn) 243 { 244 <div class="price price--product-list dw-mod">@product.Price.PriceFormatted</div> 245246 } 247 else 248 { 249 <div class="u-ta-left dw-mod @displayCss"> 250 <label for="SignInModalTrigger" class="item-number sign-in-modal-trigger-button" onclick="setTimeout(function () { document.getElementById('LoginUsername').focus() }, 10)"> 251 @Translate("Logga_in_for_pris_och_kop") 252 </label> 253 </div> 254 } 255 } 256 } 257258 </div> 259 <div class="product-list__grid-item__footer dw-mod @displayCss"> 260 <div> 261 <a class="u-no-margin btn btn--secondary dw-mod" title="Visa" id="@cartButtonId" onclick="" href="@productLink">@Translate("View")</a> 262 </div> 263 </div> 264 </div> 265 </div> 266267 } 268269 </div> 270 </div> 271272 <div class="grid"> 273 <div class="grid__col-12 u-no-padding"> 274275 @{ 276277 var nextPageCount = 0; 278 if (Model.CurrentPage < Model.PageCount) 279 { 280 nextPageCount = Model.PageSize + 36; 281 } 282283 var baseUrl = $"{Dynamicweb.Context.Current.Request.Path}?ID={Dynamicweb.Frontend.PageView.Current().ID}&GroupId={Model.Group.Id}&pagesize={nextPageCount}"; 284285 if (Model.PageCount > Model.CurrentPage) 286 { 287 <a href="@baseUrl" id="LoadMoreButton" class="btn btn--primary btn--full dw-mod" data-current="1" data-page-size="@Model.PageSize;" data-total="4"> 288 @Translate("Load") 36 @Translate("more") 289 </a> 290 } 291 } 292293 <button type="button" class="btn btn--clean" onclick="window.scroll(0, 0)">@Translate("Return to top")</button> 294 </div> 295 </div> 296 @functions { 297298 private static readonly Random _rnd = new Random(); 299300 public RandomVariant GetRandomProduct(string rawData, bool render_4) 301 { 302303 if (string.IsNullOrWhiteSpace(rawData)) 304 return null; 305306 var variants = rawData 307 .Split(';') 308 .Select(item => item.Split(',')) 309 .Where(parts => parts.Length >= 3) 310 .Select(parts => new RandomVariant 311 { 312 ProductId = parts[0].Trim(), 313 VariantId = parts[1].Trim(), 314 Name = parts[2].Trim() 315 }) 316 .ToList(); 317318 if (!variants.Any()) 319 return null; 320321 var image_4 = string.Empty; 322323324 var randomVariant = variants[_rnd.Next(variants.Count)]; 325326 if (render_4) 327 { 328 image_4 = "_4"; 329 } 330331 randomVariant.Image = $"/files/images/produktbilder/{randomVariant.ProductId}{image_4}.jpg"; 332333 return randomVariant; 334335 } 336337 public class RandomVariant 338 { 339 public string ProductId { get; set; } 340 public string VariantId { get; set; } 341 public string Name { get; set; } 342 public string Image { get; set; } 343 } 344 }