Error executing template "Designs/eldorado-b2b/eCom/Productlist/eldorado-brands-products-with-filters.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
at CompiledRazorTemplates.Dynamic.RazorEngine_2ec728c5a8894168ad5ad76e4d9217f7.Execute() in D:\dynamicweb.net\Solutions\eldorado.new.LIVE\Application\Files\Templates\Designs\eldorado-b2b\eCom\Productlist\eldorado-brands-products-with-filters.cshtml:line 366
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.Collections.Specialized
2 @using System.Text
3 @using Co3.Espresso.Base.Extensions
4 @using Co3.Espresso.Website.Models.FrontEnd
5 @using Co3.Espresso.Website.Models.FrontEnd.Ecommerce
6 @using Co3.Espresso.Website.Models.FrontEnd.Handlebars
7 @using Co3.Espresso.Website.Models.FrontEnd.Settings
8 @using Co3.Espresso.Website.Services
9 @using Dynamicweb.Ecommerce
10 @using Dynamicweb.Ecommerce.Products
11 @using ProductService = Co3.Espresso.Website.Services.ProductService
12 @using System.Web
13 @using Dynamicweb.Frontend
14 @using Dynamicweb.Indexing.Querying
15 @using Dynamicweb.Modules
16 @using Newtonsoft.Json
17 @using SortInfo = Dynamicweb.Indexing.Querying.Sorting.SortInfo
18 @inherits Co3.Espresso.Website.TemplateBases.Paragraphs.Module
19 @{
20 bool showFilters = Espresso.Item.FiltersShow == "True";
21 bool showNavigation = Espresso.Item.NavigationShow == "True";
22 bool showHeading = Espresso.Item.HeadingShow == "True";
23 EspressoSort sort = ProductListService.Instance.GetSort();
24 25 26 Properties moduleProperties = PageView.Current()?.CurrentParagraph?.ModuleProperties;
27 string moduleSortBy = sort.By; // GetString( "Ecom:ProductList.SortBy" );
28 string moduleSortOrder = sort.Order; // GetString( "Ecom:ProductList.SortOrder" );
29 30 if ( moduleProperties != null && moduleProperties.Values.ContainsKey( "QuerySortByParams" ) )
31 {
32 IEnumerable< SortInfo > sortInfos = new List< SortInfo >();
33 StringBuilder _moduleSortBy = new StringBuilder();
34 StringBuilder _moduleSortOrder = new StringBuilder();
35 36 if ( moduleProperties.Values[ "QuerySortByParams" ]?.ToString() != "null" )
37 {
38 string querySortByParams = moduleProperties.Values[ "QuerySortByParams" ].ToString().Replace( """, "\"" );
39 sortInfos = JsonConvert.DeserializeObject< IEnumerable< SortInfo > >( querySortByParams );
40 }
41 else
42 {
43 IQuery iQuery = new QueryService().LoadQuery( "EspressoProducts", "Products" );
44 sortInfos = iQuery.SortOrder;
45 }
46 47 foreach ( SortInfo sortOrder in sortInfos )
48 {
49 _moduleSortBy.AppendLine( sortOrder.Field );
50 _moduleSortOrder.AppendLine( sortOrder.SortDirection.ToString() == "Descending" ? "DESC" : "ASC" );
51 }
52 moduleSortBy = _moduleSortBy.Replace( Environment.NewLine, "," ).ToString();
53 moduleSortOrder = _moduleSortOrder.Replace( Environment.NewLine, "," ).ToString();
54 moduleSortBy = moduleSortBy.Substring( 0, moduleSortBy.Length - 1 );
55 moduleSortOrder = moduleSortOrder.Substring( 0, moduleSortOrder.Length - 1 );
56 }
57 58 ClassList asideClasses = new ClassList();
59 ClassList mainClasses = new ClassList();
60 61 if ( showNavigation )
62 {
63 asideClasses.AddClasses( "col-12 col-lg-3 col-xl-2" );
64 mainClasses.AddClasses( "col-12 col-lg-9 col-xl-10" );
65 }
66 else
67 {
68 asideClasses.AddClasses( "d-none" );
69 mainClasses.AddClasses( "col-12" );
70 }
71 72 73 HandlebarsProductListTemplate handlebarsProductListTemplate = HandlebarsService.Instance.GetProductListTemplate( new HandlebarsProductListTemplateSettings
74 {
75 Classes = new ClassList( "w-100 e-productlist js-e-productlist js-e-require" ),
76 HeaderClasses = new ClassList( "col-12" ),
77 MainClasses = mainClasses,
78 AsideClasses = asideClasses,
79 FooterClasses = new ClassList( "col-12 col-lg-3 col-xl-2" ),
80 PageSize = string.IsNullOrEmpty( HttpContext.Current.Request[ "PageSize" ] ) ? GetInteger( "Ecom:ProductList.PageSize" ).ToString() : HttpContext.Current.Request[ "PageSize" ],
81 PageNumber = string.IsNullOrEmpty( HttpContext.Current.Request[ "PageNum" ] ) ? GetInteger( "Ecom:ProductList.CurrentPage" ).ToString() : HttpContext.Current.Request[ "PageNum" ],
82 SortBy = string.IsNullOrEmpty( HttpContext.Current.Request[ "SortBy" ] ) ? moduleSortBy : HttpContext.Current.Request[ "SortBy" ],
83 SortOrder = string.IsNullOrEmpty( HttpContext.Current.Request[ "SortOrder" ] ) ? moduleSortOrder : HttpContext.Current.Request[ "SortOrder" ],
84 //SortBy = string.IsNullOrEmpty( HttpContext.Current.Request[ "SortBy" ] ) ? sort.By : HttpContext.Current.Request[ "SortBy" ],
85 //SortOrder = string.IsNullOrEmpty( HttpContext.Current.Request[ "SortOrder" ] ) ? sort.Order : HttpContext.Current.Request[ "SortOrder" ],
86 ShowFilters = showFilters,
87 ShowSorting = Espresso.Item.SortShow == "True",
88 Heading = Espresso.Item.HeadingShow == "True" ? Espresso.Item.Name : string.Empty
89 } );
90 91 92 List< EspressoPagingPage > productListPaging = new List< EspressoPagingPage >();
93 if ( GetLoop( "Ecom:ProductList.Pages" ).Count > 0 )
94 {
95 foreach ( LoopItem page in GetLoop( "Ecom:ProductList.Pages" ) )
96 {
97 productListPaging.Add( new EspressoPagingPage
98 {
99 Url = page.GetString( "Ecom:ProductList.Pages.Page.Url" ),
100 Number = page.GetString( "Ecom:ProductList.Pages.Page.Number" )
101 } );
102 }
103 }
104105 List< EspressoProduct > productListProducts = GetLoop( "Products" ).Select(
106 productLoopItem => ProductService.Instance.GetEspressoProduct(
107 new ProductSettings
108 {
109 Id = productLoopItem.GetString( "Ecom:Product.ID" ),
110 VariantId = productLoopItem.GetString( "Ecom:Product.VariantID" ),
111 PrimaryVariantId = productLoopItem.GetString( "Ecom:Product.DefaultVariantComboID" ),
112 EmbeddedInModelList = false
113 }
114 )
115 ).ToList();
116117 EspressoProductList espressoProductList = ProductListService.Instance.GetProductList(
118 new ProductListSettings
119 {
120 Products = productListProducts,
121 Paging = productListPaging,
122 PageSize = Convert.ToInt32( handlebarsProductListTemplate.PageSize ),
123 CurrentPage = Convert.ToInt32( handlebarsProductListTemplate.PageNumber )
124 }
125 );
126127 List< LoopItem > brandFacetOptions = GetLoop( "FacetGroups" ).FirstOrDefault( fg => fg.GetString( "FacetGroup.Name" ) == "Brands" ).GetLoop( "Facets" ).FirstOrDefault( f => f.GetString( "Facet.Name" ) == "FBrand" ).GetLoop( "FacetOptions" ).ToList();
128129 HttpContext.Current.Items[ "CurrentGroupID" ] = Values.ContainsKey( "Ecom:Group.ID" ) ? Values[ "Ecom:Group.ID" ] : string.Empty;
130 string fBrandValue = HttpContext.Current.Request.QueryString[ "FBrand" ];
131 }
132133 @*@using Co3.Espresso.Base.Extensions
134 @using Co3.Espresso.Base.Models
135 @using Co3.Espresso.Website.Models.FrontEnd
136 @using Co3.Espresso.Website.Models.FrontEnd.Elements
137 @using Co3.Espresso.Website.Models.FrontEnd.Settings
138 @using Co3.Espresso.Website.Services
139 @using Dynamicweb.Content
140 @using Dynamicweb.Content.Data
141 @using Dynamicweb.Core
142 @using Dynamicweb.Ecommerce
143 @using Dynamicweb.Ecommerce.Products
144 @using Dynamicweb.Ecommerce.Shops
145 @using Dynamicweb.Extensibility
146 @using Dynamicweb.Frontend
147 @using Dynamicweb.Security.Permissions
148149150 @{
151 PageView currentPageView = PageView.Current();
152 string areaUrlName = !string.IsNullOrEmpty( currentPageView.Area.UrlName ) ? "/" + currentPageView.Area.UrlName: "";
153154 Group group = Services.ProductGroups.GetGroup(GetString("Ecom:Group.ID"));
155 string groupName = string.Empty;
156 string groupImage = string.Empty;
157 Shop shop = new ShopService().GetShop( PageView.Current().Area.EcomShopId );
158 IEnumerable<Group> productGroupsPath = new List< Group >();
159 List<dynamic> breadCrumbCollection = new List< dynamic >();
160 string pageId = PageView.Current().Page.ID.ToString();
161162 if (group != null)
163 {
164 groupName = group.Name;
165 groupImage = !string.IsNullOrEmpty( group.LargeImage ) ? group.LargeImage : group.ParentGroups.Count > 0 ? group.ParentGroups.FirstOrDefault()?.LargeImage : string.Empty;
166 productGroupsPath = Services.ProductGroups.FindPath(shop, group );
167 }
168169170 foreach (ElementWithIndex< Group > _group in productGroupsPath.WithIndex() )
171 {
172 string _link = string.Format("/Default.aspx?ID={0}&GroupID={1}", pageId, _group.Element.Id);
173 breadCrumbCollection.Add( new
174 {
175 index = _group.Index,
176 link = _link,
177 label = _group.Element.Name
178 });
179 }
180181 ClassList sectionClasses = new ClassList();
182183184 string hideHeaderClass = "";
185 if ( Espresso.Item.HeadingShow == "False" )
186 {
187 hideHeaderClass = "d-none";
188 }
189 else
190 {
191 if(!string.IsNullOrEmpty(groupName) ) {
192 sectionClasses.AddClasses("e-section d-flex align-items-center eldorado-productlist-header");
193194 if (!string.IsNullOrEmpty(groupImage) )
195 {
196 groupImage = ImageService.Instance.GetImageURL( $"/Files{groupImage}", 1700, 300, 5, 90 );
197 sectionClasses.AddClasses("e-text-light e-section-height-xs");
198 }
199 else
200 {
201 sectionClasses.AddClasses("mt-5");
202 }
203 }
204 else
205 {
206 sectionClasses.AddClasses("e-section d-flex align-items-center eldorado-productlist-header");
207 }
208 }
209 <script>console.log(@JsonService.Instance.ToJson(Espresso.Item.HeadingShow));</script>
210 }
211212 @RenderingService.Instance.SectionEnd()
213214 @if ( ( bool )Espresso.Page.Item[ "HeaderHide" ] == false )
215 {
216 <section class="@sectionClasses @hideHeaderClass" style="background-image: url('@(groupImage)')">
217 <div class="container-fluid">
218 <div class="row">
219 <div class="col-12 col-md-12 col-lg-12 mx-auto">
220 <div class="row">
221222 <div class="p p-imagetext p-imagetext-tb col-12" >
223 <div class="row">
224 <div class="p-txt-container col-12">
225 <h2 class="mb-0">
226 @groupName
227 </h2>
228 </div>
229 </div>
230 </div>
231232 </div>
233 </div>
234 </div>
235 </div>
236 </section>
237 }
238 else
239 {
240 <a class="position-relative nav-link js-e-require" data-require="cart" href="@areaUrlName/shop/cart"></a>
241 }
242243244 <section class="p p-section e-section js-e-section pt-1 ">
245 <div class="container-fluid">
246 <div class="row">
247 <div class="col-12 mx-auto">
248 <div class="row">
249 <div class="p p-imagetext p-imagetext-tb col-12">
250251 <nav class="e-breadcrumb-container @hideHeaderClass">
252 <ol class="breadcrumb nav p-0" itemscope itemtype="https://schema.org/BreadcrumbList">
253 <li class="breadcrumb-item">
254 <a href="/">
255 @ServiceLocator.Current.GetPageService().GetFirstPageForArea( PageView.Current().Area.ID ).MenuText
256 </a>
257 </li>
258 @foreach (dynamic breadCrumbItem in breadCrumbCollection.OrderBy(bcc => bcc.index) )
259 {
260 <li class="breadcrumb-item">
261 <a href="@breadCrumbItem.link">
262 @breadCrumbItem.label
263 </a>
264 </li>
265 }
266 </ol>
267 </nav>
268 *@
269270271 <div class="@handlebarsProductListTemplate.Classes" data-current-page="@GetInteger( "Ecom:ProductList.CurrentPage" )" data-page-count="@GetLoop( "Ecom:ProductList.Pages" ).Count" data-page-size="@handlebarsProductListTemplate.PageSize" data-products-url="@Espresso.Item.ProductsUrl" data-filters-url="@Espresso.Item.ProductsUrl" data-require="productlist">
272 <div class="row">
273 <div class="col-12">
274 @RenderingService.Instance.PartialView( "ecom/productlist/partials/header.cshtml", handlebarsProductListTemplate )
275 </div>
276277 <div class="@handlebarsProductListTemplate.AsideClasses">
278279 <div class="d-lg-block d-none">
280 <div class="e-productlist-filters-group js-e-productlist-filters-group">
281 <fieldset class="collapse e-productlist-filters-group-options show p-0" id="e-productlist-filters-group-navigation">
282 <div class="e-nav-local e-nav-local-vertical mb-2">
283 <nav class="e-nav-local-container">
284 <ul class="flex-column nav">
285 @{
286 foreach ( LoopItem facetOption in brandFacetOptions.Where(bfo => bfo.GetInteger("FacetOption.Count") > 0) )
287 {
288 string pagePath = string.Format( "/Default.aspx?ID={0}&FBrand={1}", PageView.Current().Page.ID, facetOption.GetString("FacetOption.Value") );
289 string activeCssClass = fBrandValue == facetOption.GetString( "FacetOption.Value" ) ? "font-weight-bold" : string.Empty;
290 <li class="nav-item @activeCssClass">
291 <a class="nav-link" href="@pagePath">
292 <span class="e-nav-pagename">@facetOption.GetString("FacetOption.Label")</span>
293 </a>
294 </li>
295 }
296 }
297 </ul>
298 </nav>
299 </div>
300 </fieldset>
301 </div>
302 </div>
303304 @{
305 if ( Values.ContainsKey( "Ecom:Group.ID" ) )
306 {
307 Group productGroup = Services.ProductGroups.GetGroup( Values[ "Ecom:Group.ID" ]?.ToString() );
308 if ( productGroup != null )
309 {
310 string productListSidebarContentPage = productGroup.GetProductGroupFieldValue< string >( "ProductListSidebarContentPage" );
311 if ( !string.IsNullOrEmpty( productListSidebarContentPage ) )
312 {
313 int.TryParse( productListSidebarContentPage.Split( new[] { "=" }, StringSplitOptions.RemoveEmptyEntries ).Last(), out int productListSidebarContentPageID );
314 if ( productListSidebarContentPageID > 0 )
315 {
316 <div class="mt-3">
317 @RenderPageContent( productListSidebarContentPageID )
318 </div>
319 }
320 }
321 }
322 }
323 }
324 </div>
325326 <div class="@handlebarsProductListTemplate.MainClasses">
327 <form class="js-e-productlist-form">
328 <input name="PageNum" type="hidden" value="@HttpUtility.HtmlAttributeEncode( handlebarsProductListTemplate.PageNumber )">
329 <input name="SortBy" type="hidden" value="@HttpUtility.HtmlAttributeEncode( handlebarsProductListTemplate.SortBy )">
330 <input name="SortOrder" type="hidden" value="@HttpUtility.HtmlAttributeEncode( handlebarsProductListTemplate.SortOrder )">
331 <input name="PageSize" type="hidden" value="@HttpUtility.HtmlAttributeEncode( handlebarsProductListTemplate.PageSize )">
332333334 @{
335 NameValueCollection urlParams = Dynamicweb.Context.Current.Request.QueryString;
336 List< string > paramsToIgnore = new List< string >() { "PageNum", "SortBy", "SortOrder" };
337338 if ( handlebarsProductListTemplate.ShowFilters )
339 {
340 foreach ( LoopItem facetGroup in GetLoop( "FacetGroups" ) )
341 {
342 <input name="fg" type="hidden" value="@facetGroup.GetString( "FacetGroup.Name" )">
343 }
344 }
345346 foreach ( LoopItem queryParameter in GetLoop( "Query.Parameters" ) )
347 {
348 if ( string.IsNullOrEmpty( queryParameter.GetString( "Parameter.Value" ) ) == false )
349 {
350 if ( queryParameter.GetBoolean( "Parameter.IsHandledAsFacet" ) == false && queryParameter.GetString( "Parameter.Name" ) != "q" )
351 {
352 string dataAttrExcludeInUrlValue = "true";
353 if ( urlParams[ queryParameter.GetString( "Parameter.Name" ) ] != null )
354 {
355 dataAttrExcludeInUrlValue = string.Empty;
356 paramsToIgnore.Add( queryParameter.GetString( "Parameter.Name" ) );
357 }
358359 <input name="@queryParameter.GetString( "Parameter.Name" )" type="hidden" value="@HttpUtility.HtmlAttributeEncode( queryParameter.GetString( "Parameter.Value" ) )" data-excludeinurl="@dataAttrExcludeInUrlValue">
360 }
361 }
362 }
363364 foreach ( object urlParam in urlParams)
365 {
366 if ( !paramsToIgnore.Contains(urlParam.ToString()) && !paramsToIgnore.Contains(urlParam.ToString()))
367 {
368 <input name="@urlParam.ToString()" type="hidden" value="@HttpUtility.HtmlAttributeEncode( urlParams[urlParam.ToString()] )">
369 }
370 }
371 }
372373374 @{
375 Uri urlReferrer = HttpContext.Current.Request.UrlReferrer;
376 string urlBack = "/";
377 if ( urlReferrer != null )
378 {
379 urlBack = urlReferrer.LocalPath;
380 }
381 }
382383 @if ( ( bool )Espresso.Page.Item[ "HeaderHide" ] )
384 {
385 <a class="btn btn-sm btn-secondary mb-3 align-self-center js-e-back-link order-first arrow-left" href="@urlBack">
386 <i class="material-icons material-icons-large d-none">arrow_back</i>Tilbage
387 </a>
388 }
389390 @RenderingService.Instance.PartialView( "ecom/productlist/partials/filters-search.cshtml", Espresso )
391392393 @RenderingService.Instance.PartialView( "ecom/productlist/partials/horizontal-filters.cshtml", Espresso )
394 </form>
395 @RenderingService.Instance.PartialView( "ecom/productlist/partials/products.cshtml", espressoProductList )
396 @RenderingService.Instance.PartialView( "ecom/productlist/partials/paging.cshtml", espressoProductList )
397 @RenderingService.Instance.PartialView( "ecom/productlist/partials/footer.cshtml", handlebarsProductListTemplate )
398 </div>
399 </div>
400 </div>
401