Error executing template "Designs/Swift-v2/DealerList.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
   at CompiledRazorTemplates.Dynamic.RazorEngine_ef34dbe8c0b845aaa779dd1cdf6977c6.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.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.DynamicWrapperService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineServiceExtensions.RunCompile(IRazorEngineService service, String name, 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 RazorEngine.Templating.RazorEngineServiceExtensions.RunCompile(IRazorEngineService service, String name, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineServiceExtensions.RunCompile(IRazorEngineService service, String templateSource, 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 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 2 3 @using Dynamicweb 4 @using Dynamicweb.Core.Encoders 5 @using System.Globalization 6 @using Dynamicweb.Ecommerce.Products 7 @using Dynamicweb.Ecommerce.ProductCatalog 8 @using System.Text.RegularExpressions 9 10 @using FlexMedia.Plastmo.Integration.Frontend.Models 11 12 13 14 @functions { 15 16 @* 17 string? DoubleToString(double? value) 18 { 19 if (value.HasValue) 20 { 21 return value.Value.ToString(CultureInfo.InvariantCulture); 22 } 23 return null; 24 } 25 *@ 26 27 // to replace the product tags in Dealer links 28 string RelpaceProductTags(string value, string quantity, string count , ProductViewModel product) 29 { 30 string outvalue = value 31 .Replace("[ProductID]",product.Id) 32 .Replace("[ProductNumber]",product.Number) 33 .Replace("[ProductDB]",product.ProductFields["TUN"].Value.ToString()) 34 .Replace("[ProductVVS]",product.ProductFields["VVS_nummer"].Value.ToString()) 35 .Replace("[ProductBM]",product.ProductFields["bygmavno"].Value.ToString()) 36 .Replace("[ProductEAN]",product.EAN) 37 .Replace("[VariantID]",product.VariantId) 38 .Replace("[ProductName]",product.Name) 39 // .Replace("[ProductQuantity]","{ProductQuantity}") 40 .Replace("[ProductQuantity]",quantity) 41 .Replace("[ProductCNT]",count); 42 // .Replace("[ProductCNT]","{ProductCNT}"); 43 44 // int cnt = 0; 45 // string outvalue = Regex.Replace(revalue, "{ProductCNT}", m => (cnt++).ToString()); 46 47 return outvalue; 48 } 49 50 } 51 52 53 54 @{ 55 56 57 58 59 @* for custom link to dealers from json file *@ 60 @* 61 bool hasDealer = false; 62 bool hasPlastmoDealer = false; 63 bool singleDealer = false; 64 List<string> DealersIDs = new(); 65 66 if(!Pageview.IsVisualEditorMode){ 67 string fieldName = "Dealers"; 68 var fieldOptions = Dynamicweb.Ecommerce.Services.FieldOptions.GetOptionsByFieldId(fieldName); 69 bool fieldExist = product.ProductFields.TryGetValue(fieldName, out FieldValueViewModel field); 70 if (fieldExist && field?.Value != null){ 71 List<FieldOptionValueViewModel> options = field?.Value as List<FieldOptionValueViewModel>; 72 DealersIDs = options.Select(o => o.Value).ToList(); 73 } 74 } 75 76 var DealerList = FlexMedia.Plastmo.Integration.Frontend.DealersHelper.GetDealers(DealersIDs,true); 77 // FlexMedia.Plastmo.Integration.Frontend.GetDealer(string dealerId, bool cached = true) 78 // FlexMedia.Plastmo.Integration.Frontend.GetDealer(string dealerId, bool cached = false) 79 80 int cntLinks = 0; 81 string firstDealerWithLink = ""; 82 int DealerCnt = DealerList.Count(); 83 foreach (var dealer in DealerList){ 84 if((!string.IsNullOrEmpty(dealer.DealerAddtoCartLink) || !string.IsNullOrEmpty(dealer.DealerProductLink))&&dealer.DealerIsPlastmo!="True"){ 85 cntLinks++;firstDealerWithLink = dealer.DealerID; 86 } 87 if(dealer.DealerIsPlastmo=="True"){hasPlastmoDealer=true;} 88 } 89 90 if(DealerCnt>=1 && (cntLinks>=1)){hasDealer=true;} 91 if(DealerCnt==1 || (cntLinks==1)){singleDealer=true;} 92 93 // shuffle 94 var shuffle = Enumerable.Range(1, DealerCnt).ToList(); 95 if(DealerCnt>=2){ 96 Random rnd = new Random(); 97 foreach (int num in shuffle){ 98 int n = rnd.Next(DealerCnt); 99 var a = DealerList[num-1]; 100 var b = DealerList[n]; 101 DealerList[num-1] = b; 102 DealerList[n] = a; 103 } 104 <small style="display:none;" t="shuffel">hasDealer:@hasDealer</small> 105 } 106 107 *@ 108 109 } 110 111 112 @{ 113 string CurrentLang = Dynamicweb.Ecommerce.Common.Context.LanguageID; 114 115 // var test = Dynamicweb.Ecommerce.Shops.ShopService.GetDefaultShop(); 116 117 var PVMsettings = new ProductViewModelSettings( 118 Dynamicweb.Ecommerce.Common.Context.LanguageID, 119 Dynamicweb.Ecommerce.Common.Context.Currency.Code, 120 Dynamicweb.Ecommerce.Common.Context.Country.Code2, 121 Dynamicweb.Ecommerce.Common.Context.Cart?.ShopId 122 ); 123 124 125 var productsRaw = Dynamicweb.Context.Current.Request.QueryString["prod"]; 126 var products = productsRaw?.Split(',').Select(id => id.Trim()).Where(id => !string.IsNullOrEmpty(id)).ToList(); 127 // var productpairs = products.Chunk(2); 128 // ?prod=275110331,2,275110301,3 129 130 131 132 133 var productIdsRaw = Dynamicweb.Context.Current.Request.QueryString["products"]; 134 var productIds = productIdsRaw?.Split(',').Select(id => id.Trim()).Where(id => !string.IsNullOrEmpty(id)).ToList(); 135 136 var productQuantitiesRaw = Dynamicweb.Context.Current.Request.QueryString["quantity"]; 137 var productQuantities = productQuantitiesRaw?.Split(',').Select(id => id.Trim()).Where(id => !string.IsNullOrEmpty(id)).ToList(); 138 139 // ?products=275110331,275110301&quantity=2,3 140 141 var productService = new ProductService(); 142 143 // var products = productIds.Select(id => productService.GetProductById(id,"", CurrentLang)).Where(p => p != null).ToList(); 144 145 146 147 var productPair = new List<(Product Product, int Quantity)>(); 148 149 for (int i = 0; i < productIds.Count; i++){ 150 var id = productIds[i]; 151 // fallback if quantities list is shorter 152 var qty = (productQuantities != null && i < productQuantities.Count && int.TryParse(productQuantities[i], out int q))? q : 1; 153 var product = productService.GetProductById(id, "", CurrentLang); 154 if (product != null){ 155 156 // var viewModel = Dynamicweb.Ecommerce.ProductCatalog.ProductViewModelFactory.Create(product); 157 // productPair.Add((viewModel, qty)); 158 productPair.Add((product, qty)); 159 160 } 161 } 162 163 164 165 166 167 168 169 if (productPair != null){ 170 171 172 173 bool hasDealer = false; 174 bool hasPlastmoDealer = false; 175 bool singleDealer = false; 176 177 List<string> DealersIDs = null; 178 179 foreach (var item in productPair){ 180 var product = item.Product; 181 182 var DealersIDsRaw = product.ProductFieldValues.GetProductFieldValue("Dealers").Value.ToString(); 183 var values = DealersIDsRaw?.Split(',').Select(x => x.Trim()).Where(x => !string.IsNullOrEmpty(x)).ToList(); 184 // if (values == null || !values.Any()){continue;} 185 // if (values == null){continue;} 186 if (DealersIDs == null){DealersIDs = values;}else{DealersIDs = DealersIDs.Intersect(values).ToList();} 187 } 188 189 DealersIDs = DealersIDs ?? new List<string>(); 190 191 192 193 if (DealersIDs.Any() && 1==2){ 194 <ul> 195 @foreach (var DealerID in DealersIDs){ 196 <li>@DealerID</li> 197 } 198 </ul> 199 } 200 201 var DealerList = FlexMedia.Plastmo.Integration.Frontend.DealersHelper.GetDealers(DealersIDs,false); 202 // FlexMedia.Plastmo.Integration.Frontend.GetDealer(string dealerId, bool cached = true) 203 // FlexMedia.Plastmo.Integration.Frontend.GetDealer(string dealerId, bool cached = false) 204 205 int cntLinks = 0; 206 string firstDealerWithLink = ""; 207 int DealerCnt = DealerList.Count(); 208 foreach (var dealer in DealerList){ 209 if((!string.IsNullOrEmpty(dealer.DealerAddtoCartLink) || !string.IsNullOrEmpty(dealer.DealerProductLink))&&dealer.DealerIsPlastmo!="True"){ 210 cntLinks++;firstDealerWithLink = dealer.DealerID; 211 } 212 if(dealer.DealerIsPlastmo=="True"){hasPlastmoDealer=true;} 213 } 214 215 if(DealerCnt>=1 && (cntLinks>=1)){hasDealer=true;} 216 if(DealerCnt==1 || (cntLinks==1)){singleDealer=true;} 217 218 // shuffle 219 var shuffle = Enumerable.Range(1, DealerCnt).ToList(); 220 if(DealerCnt>=2){ 221 Random rnd = new Random(); 222 foreach (int num in shuffle){ 223 int n = rnd.Next(DealerCnt); 224 var a = DealerList[num-1]; 225 var b = DealerList[n]; 226 DealerList[num-1] = b; 227 DealerList[n] = a; 228 } 229 } 230 231 <small style="display:none;" t="shuffel"> 232 233 DealerCnt:@DealerCnt<br> 234 hasDealer:@hasDealer<br> 235 hasPlastmoDealer:@hasPlastmoDealer<br> 236 singleDealer:@singleDealer<br> 237 </small> 238 239 240 241 242 243 @* 244 if (DealerList.Any()){ 245 246 foreach (var dealer in DealerList){ 247 248 <br><small style="_display:none;"> 249 dealer.DealerDomain:@dealer.DealerDomain<br> 250 dealer.DealerCollectionLink:@dealer.DealerCollectionLink<br> 251 dealer.DealerProductLink:@dealer.DealerProductLink<br> 252 AddTocartisFormLink:@AddTocartisFormLink<br> 253 </small> 254 255 } 256 } 257 *@ 258 259 @*<hr>*@ 260 261 if(!Pageview.IsVisualEditorMode && hasDealer){ 262 263 <div class="title mb-3 btn btn-outline-primary theme" data-dw-button="primary" onclick="offCanvasDealerList();">@Translate("buy at dealer","Køb hos en forhandler")</div> 264 <script> 265 function offCanvasDealerList(){ 266 var d=document.getElementById("DealerOffcanvas"); 267 if(d.classList.contains("show")){ 268 d.classList.remove("show");document.body.getElementsByClassName("offcanvas-backdrop")[0].remove(); 269 }else{ 270 var e=document.createElement('div');e.className="offcanvas-backdrop fade show";e.onclick=function (){offCanvasDealerList();};document.body.appendChild(e);d.classList.add("show"); 271 } 272 } 273 </script> 274 275 276 <style> 277 278 div#DealerOffcanvas{ 279 /*background-color:#cfc;*/ 280 } 281 282 div#DealerOffcanvas figure{ 283 border:solid 1px #415f77; 284 border-radius:50%; 285 /*padding:.7em;*/ 286 margin:-.9em -.4em -.9em -1.2em !important; 287 288 display: flex; 289 align-items: center; 290 justify-content: center; 291 width:100px; 292 height:100px; 293 overflow:hidden; 294 } 295 296 div#DealerOffcanvas figure a{ 297 /*margin:auto;*/ 298 299 display: flex; 300 align-items: center; 301 justify-content: center; 302 303 width: 100%; 304 height: 100%; 305 } 306 div#DealerOffcanvas figure a img{ 307 /* width:70px;*/ 308 max-width: 100%; 309 max-height: 100%; 310 /* object-fit: contain;*/ 311 transform: scale(0.707); 312 transition: transform .2s; 313 } 314 div#DealerOffcanvas figure a:hover img{ 315 transform: scale(0.85); 316 } 317 </style> 318 319 <div class="offcanvas offcanvas-end overflow-y-auto" tabindex="-1" data-dw-colorscheme="lightgrey1" id="DealerOffcanvas" style="visibility: visible;" aria-modal="true" role="dialog"> 320 321 <div class="modal-header sticky-top py-1 py-lg-3 ps-lg-4 pe-0 pe-lg-3" data-dw-colorscheme="light" style="box-shadow: 0 10px 10px -12px var(--bs-gray-300);"> 322 <span class="h5 m-0 flex-fill">@Translate("Select your dealer","Vælg din forhandler")</span> 323 324 <button type="button" class="btn btn-sm p-2 d-flex align-items-center justify-content-bottom" data-bs-dismiss="offcanvas" aria-label="Close" id="CloseDealerOffcanvas" onclick="offCanvasDealerList();"> 325 <span>Luk</span> 326 <span class="icon-4 mb-1"> 327 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="feather feather-x"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg> 328 </span> 329 </button> 330 </div> 331 332 <div class="dealerlist p-2 p-lg-3 h-100;"> 333 334 @foreach (var dealer in DealerList){ 335 336 337 338 bool AddTocartisFormLink = false; 339 if(dealer.DealerAddtoCartLink.Contains("<form")){AddTocartisFormLink = true;} 340 341 bool DealerIsPlastmo = dealer.DealerIsPlastmo=="True" ? true : false; 342 bool hasAddTocartLink = !string.IsNullOrEmpty(dealer.DealerAddtoCartLink) ? true : false; 343 bool hasMultiAddTocartLink = !string.IsNullOrEmpty(dealer.DealerAddMultiToCartLoop) ? true : false; 344 bool hasProdLink = !string.IsNullOrEmpty(dealer.DealerProductLink) ? true : false; 345 bool hasLogo = !string.IsNullOrEmpty(dealer.DealerLogo) ? true : false; 346 347 348 <small style="display:none;"><hr> 349 @dealer.DealerID<br> 350 @dealer.DealerName<br> 351 @dealer.DealerCountry<br> 352 @dealer.DealerIsPlastmo<br> 353 @dealer.DealerLogo<br> 354 @dealer.DealerEmail<br> 355 @dealer.DealerPhone<br> 356 @dealer.DealerDomain<br> 357 @dealer.DealerCollectionLink<br> 358 @dealer.DealerProductLink<br> 359 @dealer.DealerAddtoCartLink<br> 360 @dealer.DealerAddMultiToCartLink<br> 361 @dealer.DealerAddMultiToCartLoop<br> 362 <hr></small> 363 364 // string FullMultiLink = null; 365 string AddMultiToCartLoop = ""; 366 int multicnt = 0; 367 foreach (var item in productPair){ 368 var Product = item.Product; 369 var Quantity = item.Quantity; 370 // ProductViewModel product = item.Product; 371 // var AddMultiToCartLoop = RelpaceProductTags(dealer.DealerAddMultiToCartLoop,Product); 372 373 var productVM = ViewModelFactory.CreateView(PVMsettings,Product.Id); 374 AddMultiToCartLoop += RelpaceProductTags(dealer.DealerAddMultiToCartLoop,Quantity.ToString(),multicnt.ToString(),productVM); 375 376 multicnt++; 377 // var productViewModelFactory = Dynamicweb.Core.ServiceLocator.Current.GetInstance<IProductViewModelFactory>(); 378 // ProductViewModel productVM = productViewModelFactory.Create(Product, true); 379 380 //ProductViewModel productVM = ViewModelFactory.CreateProductViewModel(Product); 381 382 383 // <p>@Product.Id @Quantity</p> 384 385 386 } 387 388 string MultiLink = dealer.DealerAddMultiToCartLink + AddMultiToCartLoop; 389 390 @* <p>@MultiLink</p>*@ 391 392 if((hasAddTocartLink || hasProdLink) && !DealerIsPlastmo){ 393 394 395 <small style="display:none;"> 396 dealer.DealerDomain:@dealer.DealerDomain<br> 397 @* dealer.DealerCollectionLink:@dealer.DealerCollectionLink<br>*@ 398 dealer.DealerProductLink:@dealer.DealerProductLink<br> 399 AddTocartisFormLink:@AddTocartisFormLink<br> 400 </small> 401 402 403 <div class="my-2 py-1 py-lg-3 ps-lg-4 pe-0 pe-lg-3" data-dw-colorscheme="light" did="@dealer.DealerID" dn="@dealer.DealerName" dc="@dealer.DealerCountry" dip="@dealer.DealerIsPlastmo" dcl="dealer.DealerCollectionLink"> 404 <div data-swift-container="" class="d-flex m-0 py-2" data-dw-container-width="2"> 405 406 407 408 @if(hasLogo){ 409 <figure class="m-0" data-swift-gridcolumn=""> 410 <a href="@dealer.DealerDomain" title="@dealer.DealerName" target="_blank" rel="noopener"><img src="@dealer.DealerLogo" alt="@dealer.DealerName" style="width:75px"></a> 411 </figure> 412 } 413 414 <div class="m-0 align-items-right flex-fill"> 415 <div class="h6 m-0 mb-2 align-items-left justify-content-top" data-swift-gridcolumn=""><strong>@dealer.DealerName</strong></div> 416 417 <div class="m-0 align-items-right justify-content-bottom d-flex" data-dw-container-width="2"> 418 @if(hasProdLink){ 419 // string prodLink = RelpaceProductTags(dealer.DealerProductLink,product); 420 // <a href="@prodLink" target="_blank" rel="noopener" class="btn btn-secondary flex-fill" data-dw-button="secondary">@Translate("See product","Se produktet")</a> 421 } 422 @if(hasAddTocartLink && !AddTocartisFormLink){ 423 // string AddTocartLink = RelpaceProductTags(dealer.DealerAddtoCartLink,product); 424 // <a href="@AddTocartLink" target="_blank" rel="noopener" class="btn btn-primary align-items-right ms-2" data-dw-button="primary">@Translate("Add to cart","Læg i kurv")</a> 425 } 426 427 @if(hasAddTocartLink && AddTocartisFormLink){ 428 // string AddTocartLink = RelpaceProductTags(dealer.DealerAddtoCartLink,product); 429 // string formbutton = "<button type='submit' class='btn btn-primary align-items-right ms-2' data-dw-button='primary'>Læg i kurv</button></form>"; 430 // @AddTocartLink.Replace("</form>",formbutton) 431 } 432 @if(hasMultiAddTocartLink && !AddTocartisFormLink){ 433 <a href="@MultiLink" target="_blank" rel="noopener" class="btn btn-primary align-items-right ms-2" data-dw-button="primary">@Translate("Add to cart","Læg i kurv")</a> 434 435 436 } 437 438 439 440 441 @{ 442 // string AddMultiToCartLoop = RelpaceProductTags(dealer.DealerAddMultiToCartLoop,productViewModel2); 443 } 444 445 </div> 446 </div> 447 448 </div> 449 </div> 450 } 451 } 452 453 454 455 </div> 456 </div> 457 458 459 460 461 462 463 464 465 466 467 } 468 } 469 } 470 471 472 473 474 475 476 @* 477 https://dw10.staging.plastmo.flexmedia.dk/dealierlist?products=275110331,275140301,275112341,275144301 478 https://dw10.staging.plastmo.flexmedia.dk/dealierlist?products=275110331,275140301,275112341,275144301,275110301 479 https://dw10.staging.plastmo.flexmedia.dk/dealierlist?products=275110331,275110301 480 481 482 plastmo + dealer 483 https://dw10.staging.plastmo.flexmedia.dk/dealierlist?products=275112341,275110301 484 485 single + plastmo 486 https://dw10.staging.plastmo.flexmedia.dk/dealierlist?products=275112341,275110301,275110330 487 488 *@ 489