Hverdagsklær

Error executing template "Designs/Swift/Paragraph/Swift_ProductListFacets_Custom.cshtml"
System.ArgumentNullException: Value cannot be null.
Parameter name: source
   at System.Linq.Enumerable.Count[TSource](IEnumerable`1 source)
   at CompiledRazorTemplates.Dynamic.RazorEngine_f09e3ddc0b164e7c8ea8e28a9f1d805c.<>c__DisplayClass0_0.<RenderForm>b__0(TextWriter __razor_helper_writer) in D:\dynamicweb.net\Solutions\Mennt\BWNorway.cloud.dynamicweb-cms.com\files\Templates\Designs\Swift\Paragraph\Swift_ProductListFacets_Custom.cshtml:line 221
   at CompiledRazorTemplates.Dynamic.RazorEngine_f09e3ddc0b164e7c8ea8e28a9f1d805c.Execute() in D:\dynamicweb.net\Solutions\Mennt\BWNorway.cloud.dynamicweb-cms.com\files\Templates\Designs\Swift\Paragraph\Swift_ProductListFacets_Custom.cshtml:line 76
   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 Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.ParagraphViewModel> 2 @using Dynamicweb.Ecommerce.ProductCatalog 3 @using Dynamicweb.Frontend.Navigation 4 @using Dynamicweb.Environment 5 @using Dynamicweb.Core.Encoders 6 7 @{ 8 ProductListViewModel productList = new ProductListViewModel(); 9 10 if (Dynamicweb.Context.Current.Items.Contains("ProductList")) 11 { 12 productList = (ProductListViewModel)Dynamicweb.Context.Current.Items["ProductList"]; 13 } 14 15 string url = "/Default.aspx?ID=" + Model.PageID; 16 if (!url.Contains("LayoutTemplate")) 17 { 18 url += url.Contains("?") ? "&LayoutTemplate=Designs/Swift/Swift_PageClean.cshtml" : "?LayoutTemplate=Designs/Swift/Swift_PageClean.cshtml"; 19 } 20 21 string groupId = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString.Get("GroupID")) ? Dynamicweb.Context.Current.Request.QueryString.Get("GroupID") : ""; 22 23 if (groupId != "") 24 { 25 url += url.Contains("?") ? "&GroupID=" + groupId : ""; 26 } 27 28 bool facetsFound = false; 29 int selectedFacetsCount = 0; 30 31 if (productList.FacetGroups != null) 32 { 33 foreach (FacetGroupViewModel facetGroup in productList.FacetGroups) 34 { 35 foreach (FacetViewModel facet in facetGroup.Facets) 36 { 37 if (facet.Options.Count() > 0) 38 { 39 facetsFound = true; 40 41 foreach (FacetOptionViewModel option in facet.Options) 42 { 43 if (option.Selected) 44 { 45 selectedFacetsCount++; 46 } 47 } 48 } 49 } 50 } 51 } 52 string contentPadding = Model.Item.GetRawValueString("ContentPadding", ""); 53 contentPadding = Model.Item.GetRawValueString("ContentPadding", "") == "none" ? " px-0 py-2" : contentPadding; 54 contentPadding = Model.Item.GetRawValueString("ContentPadding", "") == "small" ? " px-3 py-2" : contentPadding; 55 56 bool enableSorting = Model.Item.GetBoolean("SortByNameAZ"); 57 enableSorting = Model.Item.GetBoolean("SortByNameZA") || enableSorting == true ? true : false; 58 enableSorting = Model.Item.GetBoolean("SortByNewest") || enableSorting == true ? true : false; 59 enableSorting = Model.Item.GetBoolean("SortByLowestPrice") || enableSorting == true ? true : false; 60 enableSorting = Model.Item.GetBoolean("SortByHighestPrice") || enableSorting == true ? true : false; 61 62 string layout = Model.Item.GetRawValueString("Layout", "vertical"); 63 } 64 65 @if (facetsFound || Model.Item.GetBoolean("EnableGroupNavigation") || enableSorting) 66 { 67 string theme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("Theme")) ? " theme " + Model.Item.GetRawValueString("Theme").Replace(" ", "").Trim().ToLower() : ""; 68 string modalTheme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("ModalTheme")) ? " theme " + Model.Item.GetRawValueString("ModalTheme").Replace(" ", "").Trim().ToLower() : ""; 69 string iconPath = "/Files/Templates/Designs/Swift/Assets/icons/"; 70 string selectedFacetsLabel = selectedFacetsCount > 0 ? "(" + selectedFacetsCount + ")" : ""; 71 72 if(Pageview.Device == Dynamicweb.Frontend.Devices.DeviceType.Desktop) 73 { 74 if (layout == "vertical") { 75 <form method="post" action="@url" data-response-target-element="content" id="FacetsForm_Desktop" class="d-none d-lg-block h-100 @theme"> 76 @RenderForm(productList, "desktop", enableSorting, layout) 77 </form> 78 } 79 if (layout == "horizontal") { 80 contentPadding = Model.Item.GetRawValueString("ContentPadding", "") == "small" ? " p-3" : contentPadding; 81 82 <div class="@theme @contentPadding h-100"> 83 <form method="post" action="@url" data-response-target-element="content" id="FacetsForm_Desktop" class="d-none d-lg-flex gap-3 flex-row flex-wrap"> 84 @RenderForm(productList, "desktop", enableSorting, layout) 85 86 @if (selectedFacetsCount > 0) { 87 <button type="button" class="btn btn-clean btn-sm me-sm-1 me-lg-2" onclick="swift.ProductList.ResetFacets(event)"><span class="icon-2">@ReadFile(iconPath + "rotate-ccw.svg")</span> @Translate("Clear filters")</button> 88 } 89 </form> 90 </div> 91 } 92 } 93 else 94 { 95 <div class="d-block d-lg-none mt-lg-0@(theme)"> 96 <button type="button" class="btn btn-primary w-100 d-flex" data-bs-toggle="modal" data-bs-target="#FacetsModal"> 97 <span class="flex-fill text-start"> 98 @Translate("Filter") @selectedFacetsLabel 99 </span> 100 <span class="icon-2 position-relative" style="top: 5px"> 101 @ReadFile(iconPath + "sliders.svg") 102 </span> 103 </button> 104 105 <form method="post" action="@url" data-response-target-element="content" class="modal" id="FacetsModal" tabindex="-1" aria-hidden="false"> 106 <div class="modal-dialog modal-fullscreen"> 107 <div class="modal-content"> 108 <div class="modal-header@(modalTheme)"> 109 <h5 class="modal-title">@Translate("Filters and sorting")</h5> 110 <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> 111 </div> 112 <div class="modal-body@(modalTheme)"> 113 @RenderForm(productList, "mobile", enableSorting) 114 </div> 115 <div class="modal-footer d-flex@(modalTheme)"> 116 @if (selectedFacetsCount != 0) 117 { 118 <button type="button" class="btn btn-secondary flex-fill" onclick="swift.ProductList.ResetFacets(event)">@Translate("Clear") (@selectedFacetsCount)</button> 119 <button type="button" class="btn btn-primary flex-fill" onclick="location.reload();">@Translate("Update")</button> 120 } 121 @*<button type="button" class="btn btn-primary flex-fill" onclick="location.reload();">@Translate("Update")</button>*@ 122 </div> 123 </div> 124 </div> 125 </form> 126 </div> 127 } 128 } 129 else 130 { 131 if (Pageview.IsVisualEditorMode) 132 { 133 <div class="alert alert-dark m-0" role="alert"> 134 <span>@Translate("Facets: The facets selectors will be shown here, if any")</span> 135 </div> 136 } 137 else 138 { 139 <div class="alert alert-dark m-0"> 140 @Translate("No filters are available") 141 </div> 142 } 143 } 144 145 @helper RenderForm(ProductListViewModel productList, string deviceType, bool enableSorting, string layout = "vertical") 146 { 147 string iconPath = "/Files/Templates/Designs/Swift/Assets/icons/"; 148 149 string groupId = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString.Get("GroupID")) ? Dynamicweb.Context.Current.Request.QueryString.Get("GroupID") : ""; 150 string pageSize = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString.Get("PageSize")) ? Dynamicweb.Context.Current.Request.QueryString.Get("PageSize") : productList.PageSize.ToString(); 151 152 string groupsTheme = ""; 153 string extraBottomMargin = ""; 154 if (deviceType != "mobile") 155 { 156 groupsTheme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("FacetGroupsTheme")) ? " theme " + Model.Item.GetRawValueString("FacetGroupsTheme").Replace(" ", "").Trim().ToLower() : ""; 157 extraBottomMargin = !string.IsNullOrEmpty(groupsTheme) ? "mb-3" : ""; 158 } 159 160 string contentPadding = Model.Item.GetRawValueString("ContentPadding", ""); 161 contentPadding = contentPadding == "none" ? " px-0 py-2" : contentPadding; 162 contentPadding = contentPadding == "small" ? " px-3 py-2" : contentPadding; 163 164 165 if (productList?.Group?.Id != null) 166 { 167 <input type="hidden" name="GroupId" value="@productList.Group.Id" /> 168 } 169 170 <input type="hidden" name="PageSize" value="@pageSize" /> 171 172 if (Model.Item.GetBoolean("EnableGroupNavigation")) 173 { 174 var navigationSettings = new NavigationSettings(); 175 navigationSettings.StartLevel = 2; 176 navigationSettings.Parameters.Add("ID", deviceType); 177 navigationSettings.Parameters.Add("HideTexts", false); 178 navigationSettings.Parameters.Add("HideIcons", true); 179 navigationSettings.Parameters.Add("ContentPadding", contentPadding); 180 navigationSettings.ExpandMode = ExpandMode.All; 181 182 if (layout == "vertical") { 183 navigationSettings.StopLevel = 10; 184 185 <div class="border-bottom@(contentPadding)@(@groupsTheme)"> 186 <div class="d-flex@(contentPadding)" data-bs-toggle="collapse" data-bs-target="#ProductGroupNavigation_@deviceType" role="button" aria-expanded="true" aria-controls="ProductGroupNavigation_@deviceType"> 187 <h2 class="opacity-85 m-0 flex-fill h6">@Translate("Navigation")</h2> 188 <div class="my-auto collapse-chevron-icon"></div> 189 </div> 190 <div class="collapse show" id="ProductGroupNavigation_@deviceType"> 191 @Navigation.RenderNavigation("Navigation/Vertical_Custom.cshtml", navigationSettings) 192 </div> 193 </div> 194 } 195 } 196 197 if (enableSorting) 198 { 199 if (layout == "vertical") { 200 <div class="border-bottom@(contentPadding)@(groupsTheme)"> 201 <h2 class="opacity-85 m-0 my-2 flex-fill h6">@Translate("Sort by")</h2> 202 <div class="d-flex flex-column gap-2"> 203 @RenderSorting(deviceType) 204 </div> 205 </div> 206 } 207 if (layout == "horizontal") { 208 <button class="btn @(groupsTheme) dropdown-toggle" type="button" id="#SortBy_@deviceType" data-bs-toggle="dropdown" aria-expanded="false"> 209 @Translate("Sort by") 210 </button> 211 <div class="dropdown-menu p-3 @(groupsTheme)" aria-labelledby="#SortBy_@deviceType" style="min-width: 280px"> 212 <div class="d-flex flex-column gap-2"> 213 @RenderSorting(deviceType) 214 </div> 215 </div> 216 } 217 } 218 219 int groupCount = 0; 220 int maxGroups = 8; 221 int totalGroups = productList.FacetGroups.Count(); 222 223 foreach (FacetGroupViewModel facetGroup in productList.FacetGroups) 224 { 225 string border = groupCount != totalGroups ? "border-bottom" : ""; 226 227 foreach (FacetViewModel facet in facetGroup.Facets) 228 { 229 if (facet.Options.Count() > 0) 230 { 231 if (layout == "vertical") { 232 <div class="@border@(contentPadding)@(@groupsTheme)"> 233 <div class="d-flex" data-bs-toggle="collapse" data-bs-target="#FacetGroup_@facet.Name.Replace(" ", "")_@deviceType" role="button" aria-expanded="true" aria-controls="FacetGroup_@facet.Name.Replace(" ", "")_@deviceType"> 234 <h2 class="opacity-85 m-0 flex-fill h6 my-2">@Translate(facet.Name)</h2> 235 <div class="my-auto collapse-chevron-icon"></div> 236 </div> 237 <div class="collapse show" id="FacetGroup_@facet.Name.Replace(" ", "")_@deviceType"> 238 @foreach (FacetOptionViewModel facetOption in facet.Options) 239 { 240 string renderType = facet.RenderType; 241 242 if (renderType == "Colors") 243 { 244 @RenderColorOption(facet, facetOption) 245 } 246 else 247 { 248 @RenderCheckboxOption(facet, facetOption) 249 } 250 } 251 </div> 252 </div> 253 } 254 if (layout == "horizontal") { 255 string hideSelector = groupCount < maxGroups ? "" : "d-none"; 256 int selectedFacetsInGroup = 0; 257 258 foreach (FacetOptionViewModel option in facet.Options) 259 { 260 if (option.Selected) 261 { 262 selectedFacetsInGroup++; 263 } 264 } 265 266 string label = selectedFacetsInGroup > 0 ? facet.Name + "<span class=\"badge bg-dark opacity-50 ms-2\">" + selectedFacetsInGroup + "</span>" : facet.Name; 267 268 <div class="dropdown @hideSelector js-facets-selector"> 269 <button class="btn @(groupsTheme) dropdown-toggle" type="button" id="#FacetGroup_@facet.Name.Replace(" ", "")_@deviceType" data-bs-toggle="dropdown" aria-expanded="false"> 270 @label 271 </button> 272 <div class="dropdown-menu p-3 @(groupsTheme)" aria-labelledby="#FacetGroup_@facet.Name.Replace(" ", "")_@deviceType" style="min-width: 280px"> 273 @foreach (FacetOptionViewModel facetOption in facet.Options) 274 { 275 string renderType = facet.RenderType; 276 277 if (renderType == "Colors") 278 { 279 @RenderColorOption(facet, facetOption) 280 } 281 else 282 { 283 @RenderCheckboxOption(facet, facetOption) 284 } 285 } 286 </div> 287 </div> 288 } 289 290 groupCount++; 291 } 292 } 293 } 294 295 if ((groupCount > maxGroups) && layout == "horizontal") { 296 <button type="button" class="btn @(groupsTheme)" onclick="this.closest('form').querySelectorAll('.js-facets-selector').forEach(function (selector) { selector.classList.remove('d-none'); }); this.classList.add('d-none');"><span class="icon-2">@ReadFile(iconPath + "sliders.svg")</span> @Translate("All filters")</button> 297 } 298 } 299 300 @helper RenderSorting(string deviceType) { 301 string sortBySelection = Dynamicweb.Context.Current.Request?.Form["SortBy"] ?? "NameForSort"; 302 sortBySelection = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString.Get("SortBy")) ? Dynamicweb.Context.Current.Request.QueryString.Get("SortBy") : sortBySelection; 303 string sortNameSelectedAZ = sortBySelection.ToLower() == "nameforsort" ? "checked" : ""; 304 string sortNameSelectedZA = sortBySelection.ToLower() == "-nameforsort" ? "checked" : ""; 305 string sortPriceLowSelected = sortBySelection.ToLower() == "price" ? "checked" : ""; 306 string sortPriceHighSelected = sortBySelection.ToLower() == "-price" ? "checked" : ""; 307 string sortNewSelected = sortBySelection.ToLower() == "-created" ? "checked" : ""; 308 string sortMostSoldSelected = sortBySelection.ToLower() == "-ordercount" ? "checked" : ""; 309 310 string anonymousUsersLimitations = Pageview.AreaSettings.GetRawValueString("AnonymousUsers", ""); 311 bool anonymousUser = Pageview.User == null; 312 bool hidePrice = anonymousUsersLimitations.Contains("price") && anonymousUser; 313 314 if (Model.Item.GetBoolean("SortByNameAZ")) 315 { 316 <div class="form-check"> 317 <input class="form-check-input" onchange="swift.ProductList.Update(event)" type="radio" name="SortBy" value="NameForSort" id="SortByNameAZ_@deviceType" @sortNameSelectedAZ> 318 <label class="form-check-label" for="SortByNameAZ_@deviceType"> 319 @Translate("Name (A-Z)") 320 </label> 321 </div> 322 } 323 if (Model.Item.GetBoolean("SortByNameZA")) 324 { 325 <div class="form-check"> 326 <input class="form-check-input" onchange="swift.ProductList.Update(event)" type="radio" name="SortBy" value="-NameForSort" id="SortByNameZA_@deviceType" @sortNameSelectedZA> 327 <label class="form-check-label" for="SortByNameZA_@deviceType"> 328 @Translate("Name (Z-A)") 329 </label> 330 </div> 331 } 332 if (Model.Item.GetBoolean("SortByNewest")) 333 { 334 <div class="form-check"> 335 <input class="form-check-input" onchange="swift.ProductList.Update(event)" type="radio" name="SortBy" value="-created" id="SortByNew_@deviceType" @sortNewSelected> 336 <label class="form-check-label" for="SortByNew_@deviceType"> 337 @Translate("Newest") 338 </label> 339 </div> 340 } 341 if (!hidePrice) 342 { 343 if (Model.Item.GetBoolean("SortByLowestPrice")) 344 { 345 <div class="form-check"> 346 <input class="form-check-input" onchange="swift.ProductList.Update(event)" type="radio" name="SortBy" value="Price" id="SortByPriceLow_@deviceType" @sortPriceLowSelected> 347 <label class="form-check-label" for="SortByPriceLow_@deviceType"> 348 @Translate("Lowest price") 349 </label> 350 </div> 351 } 352 if (Model.Item.GetBoolean("SortByHighestPrice")) 353 { 354 <div class="form-check"> 355 <input class="form-check-input" onchange="swift.ProductList.Update(event)" type="radio" name="SortBy" value="-Price" id="SortByPriceHigh_@deviceType" @sortPriceHighSelected> 356 <label class="form-check-label" for="SortByPriceHigh_@deviceType"> 357 @Translate("Highest price") 358 </label> 359 </div> 360 } 361 } 362 if (Model.Item.GetBoolean("SortByMostSold")) 363 { 364 <div class="form-check"> 365 <input class="form-check-input" onchange="swift.ProductList.Update(event)" type="radio" name="SortBy" value="-OrderCount" id="SortByMostSold_@deviceType" @sortMostSoldSelected> 366 <label class="form-check-label" for="SortByMostSold_@deviceType"> 367 @Translate("Most sold") 368 </label> 369 </div> 370 } 371 } 372 373 @helper RenderCheckboxOption(FacetViewModel facet, FacetOptionViewModel facetOption) 374 { 375 string facetLabel = HtmlEncoder.HtmlEncode(facetOption.Label); 376 string disabled = facetOption.Count <= 0 ? "disabled" : ""; 377 string selected = facetOption.Selected ? "checked" : ""; 378 379 if (facetLabel.ToLower() == "true") 380 { 381 facetLabel = Translate("Yes"); 382 } 383 384 if (facetLabel.ToLower() == "false") 385 { 386 facetLabel = Translate("No"); 387 } 388 389 <label class="form-check mt-1" @disabled> 390 <input type="checkbox" onclick="swift.ProductList.Update(event)" class="form-check-input" name="@facet.QueryParameter" value="[@facetOption.Value]" data-filter-value="@facetLabel" @selected> 391 <span class="form-check-label d-flex align-items-center"> 392 <span class="flex-fill">@facetLabel </span> 393 @if (facet.FacetType.ToLower() == "field") { 394 <small class="opacity-85">@facetOption.Count</small> 395 } 396 </span> 397 </label> 398 } 399 400 @helper RenderColorOption(FacetViewModel facet, FacetOptionViewModel facetOption) 401 { 402 string facetLabel = HtmlEncoder.HtmlEncode(facetOption.Label); 403 string disabled = facetOption.Count <= 0 ? "disabled" : ""; 404 string selected = facetOption.Selected ? "checked" : ""; 405 406 string image = facetOption.Value; 407 string colorCode = facetOption.Value; 408 409 var variantOption = Dynamicweb.Ecommerce.Services.VariantOptions.GetVariantOption(facetOption.Value.ToString(), Dynamicweb.Ecommerce.Common.Context.LanguageID); 410 if (variantOption != null) 411 { 412 image = variantOption.LargeImage; 413 colorCode = variantOption.Color; 414 } 415 416 <div class="colorbox"> 417 <input type="checkbox" onclick="swift.ProductList.Update(event)" class="@disabled @selected" name="@facet.QueryParameter" value="[@facetOption.Value]" data-filter-value="@facetLabel" @selected title="@facetOption.Label"> 418 @if (colorCode.Contains("#")) 419 { 420 <span class="colorbox-background" style="background-color: @colorCode"></span> 421 } 422 else 423 { 424 <img class="colorbox-background" src="/Admin/Public/GetImage.ashx?width=25&height=25&image=@image" /> 425 } 426 </div> 427 } 428
Vi fant ikke noe som samsvarte med søkeresultatet ditt
By clicking 'Accept All' you consent that we may collect information about you for various purposes, including: Statistics and Marketing