Frames

4 products

It's all in the details. Find the bike frame parts you need.

Brand

Lynskey House Blend PRO Cross Frame
Lynskey House Blend PRO Cross Frame

Lynskey House Blend PRO Cross Frame

10165
$1,994.99 InStock
200 In stock • 2-3 days delivery
Performance Aluminum Frame
Performance Aluminum Frame

Performance Aluminum Frame

10166
$150.00 InStock
82 In stock • 2-3 days delivery
Ritchey Break-Away Steel Road Frame
Ritchey Break-Away Steel Road Frame

Ritchey Break-Away Steel Road Frame

10167
$1,199.99 InStock
789 In stock • 2-3 days delivery
Lynskey House Blend R320
Lynskey House Blend R320

Lynskey House Blend R320

10033
$2,384.99 InStock
100 In stock • 2-3 days delivery
4 out of 4 products

Brand

Error executing template "Designs/Swift/Paragraph/Swift_ProductListGridView.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
   at CompiledRazorTemplates.Dynamic.RazorEngine_b262e1189db04a2f8c0559295171e510.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.DynamicWrapperService.Run(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineServiceExtensions.Run(IRazorEngineService service, String name, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass23_0.<Run>b__0(TextWriter writer)
   at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
   at RazorEngine.Templating.RazorEngineServiceExtensions.Run(IRazorEngineService service, 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.ViewModelTemplate<Dynamicweb.Frontend.ParagraphViewModel> @using Dynamicweb.Ecommerce.ProductCatalog @using Dynamicweb.Ecommerce.CustomerExperienceCenter.Favorites @using System.Linq @using Dynamicweb.Core @functions { bool isLazyLoadingForProductInfoEnabled = Dynamicweb.Core.Converter.ToBoolean(Dynamicweb.Context.Current.Items["IsLazyLoadingForProductInfoEnabled"]); string liveInfoClass = string.Empty; string productInfoFeed = string.Empty; string showPricesWithVat = string.Empty; bool neverShowVat = false; bool isDetailPage = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString.Get("ProductID")); ProductListViewModel productList = new ProductListViewModel(); } @{ if (Dynamicweb.Context.Current.Items.Contains("ProductList")) { productList = (ProductListViewModel)Dynamicweb.Context.Current.Items["ProductList"]; } showPricesWithVat = Pageview.Area.EcomPricesWithVat.ToLower(); neverShowVat = string.IsNullOrEmpty(showPricesWithVat); if (isLazyLoadingForProductInfoEnabled) { if (Dynamicweb.Context.Current.Items.Contains("ProductInfoFeed")) { productInfoFeed = Dynamicweb.Context.Current.Items["ProductInfoFeed"]?.ToString(); if (!string.IsNullOrEmpty(productInfoFeed)) { productInfoFeed = $"data-product-info-feed=\"{productInfoFeed}\""; } } liveInfoClass = "js-live-info"; } string theme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("Theme")) ? " theme " + Model.Item.GetRawValueString("Theme").Replace(" ", "").Trim().ToLower() : string.Empty; string themePadding = theme != string.Empty ? "p-3" : string.Empty; string anonymousUsersLimitations = Pageview.AreaSettings.GetRawValueString("AnonymousUsers", string.Empty); bool anonymousUser = Pageview.User == null; bool hidePrice = anonymousUsersLimitations.Contains("price") && anonymousUser || Pageview.AreaSettings.GetBoolean("ErpDownHidePrices") && !Dynamicweb.Core.Converter.ToBoolean(Dynamicweb.Context.Current.Items["IsWebServiceConnectionAvailable"]); string productTheme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("ProductTheme")) ? " theme " + Model.Item.GetRawValueString("ProductTheme").Replace(" ", string.Empty).Trim().ToLower() : string.Empty; string productThemePadding = productTheme != string.Empty ? "p-3" : string.Empty; string url = Dynamicweb.Context.Current.Request.RawUrl; bool hideFavoritesSelector = !string.IsNullOrEmpty(Model.Item.GetString("HideFavoritesSelector")) ? Model.Item.GetBoolean("HideFavoritesSelector") : false; string staticVariantsLayout = Model.Item.GetRawValueString("StaticVariantsLayout", "hide"); string groupId = productList?.Group?.Id != null ? productList.Group.Id : string.Empty; var badgeParms = new Dictionary<string, object>(); badgeParms.Add("saleBadgeType", Model.Item.GetRawValue("SaleBadgeType")); badgeParms.Add("saleBadgeCssClassName", Model.Item.GetRawValue("SaleBadgeDesign")); badgeParms.Add("newBadgeCssClassName", Model.Item.GetRawValue("NewBadgeDesign")); badgeParms.Add("newPublicationDays", Model.Item.GetInt32("NewPublicationDays")); badgeParms.Add("campaignBadgesValues", Model.Item.GetList("CampaignBadges")?.GetRawValue().OfType<string>().ToList()); bool saleBadgeEnabled = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("SaleBadgeDesign")) && Model.Item.GetRawValueString("SaleBadgeDesign") != "none" ? true : false; bool newBadgeEnabled = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("NewBadgeDesign")) && Model.Item.GetRawValueString("NewBadgeDesign") != "none" ? true : false; var favoriteParameters = new Dictionary<string, object>(); if (!anonymousUser && !hideFavoritesSelector) { int defaultFavoriteListId = 0; IEnumerable<FavoriteList> favoreiteLists = Pageview.User.GetFavoriteLists(); if (favoreiteLists.Count() == 1) { foreach (FavoriteList list in favoreiteLists) { defaultFavoriteListId = list.ListId; } } favoriteParameters.Add("ListId", defaultFavoriteListId); } } @if (!isDetailPage) { <div class="h-100@(theme) @themePadding item_@Model.Item.SystemName.ToLower()" @productInfoFeed> @if (productList.TotalProductsCount > 0) { int pageSizeSetting = Converter.ToInt32(Dynamicweb.Context.Current.Request.QueryString.Get("OriginalPageSize")) > 0 ? Converter.ToInt32(Dynamicweb.Context.Current.Request.QueryString.Get("OriginalPageSize")) : productList.PageSize; int pageSize = productList.PageSize; pageSize += pageSizeSetting; int loadedProducts = productList.PageSize > productList.TotalProductsCount ? productList.TotalProductsCount : productList.PageSize; <div class="grid grid-2 grid-lg-3"> <script> gtag("event", "view_item_list", { item_list_id: "product_list_gridview", item_list_name: "Product list (Gridview)", items: [ @foreach (ProductViewModel product in productList.Products) { <text>{ item_id: "@product.Number", item_name: "@Dynamicweb.Core.Encoders.HtmlEncoder.JavaScriptStringEncode(product.Name)", currency: "@product.Price.CurrencyCode", price: @PriceViewModelExtensions.ToStringInvariant(product.Price) },</text> } ] }); </script> @foreach (ProductViewModel product in productList.Products) { string link = product.GetProductLink(GetPageIdByNavigationTag("Shop"), false); string imagePath = product?.DefaultImage?.Value ?? string.Empty; imagePath = Dynamicweb.Context.Current.Server.UrlEncode(imagePath); string ratio = Model.Item.GetRawValueString("ImageAspectRatio", string.Empty); ratio = ratio != "0" ? ratio : string.Empty; string ratioCssClass = ratio != string.Empty ? " ratio" : string.Empty; string ratioVariable = ratio != string.Empty ? "--bs-aspect-ratio: " + ratio : string.Empty; string imagePathXs = "/Admin/Public/GetImage.ashx?width=" + 480 + "&image=" + imagePath + "&format=webp"; string imagePathS = "/Admin/Public/GetImage.ashx?width=" + 640 + "&image=" + imagePath + "&format=webp"; string imagePathFallBack = "/Admin/Public/GetImage.ashx?width=" + 640 + "&image=" + imagePath + "&format=webp"; string imageTheme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("ImageTheme")) ? " theme " + Model.Item.GetRawValueString("ImageTheme").Replace(" ", string.Empty).Trim().ToLower() : string.Empty; string imageThemePadding = imageTheme != string.Empty ? "p-3" : string.Empty; string imageOutlineStyle = imageTheme == string.Empty ? "style=\"border: 1px solid transparent\"" : string.Empty; string imageId = "ProductImage_" + product.Id + product.VariantId.Replace(".", "_"); string priceId = "ProductPrice_" + product.Id + product.VariantId.Replace(".", "_"); @* Alternative image *@ var supportedImageFormats = new string[] { ".jpg", ".webp", ".png", ".gif" }; string defaultImage = product.DefaultImage != null ? product.DefaultImage.Value : string.Empty; var selectedAssetCategories = Model.Item.GetRawValueString("AlternativeImageAssets"); IEnumerable<MediaViewModel> alternativeImagesList = product.AssetCategories.Where(x => selectedAssetCategories.Contains(x.SystemName)).SelectMany(x => x.Assets); if (alternativeImagesList.FirstOrDefault() != null) { alternativeImagesList = alternativeImagesList.OrderByDescending(x => x.Value.Equals(defaultImage)); if (alternativeImagesList.First().Value == defaultImage) { alternativeImagesList = alternativeImagesList.Skip(1); } } string alternativeImage = alternativeImagesList.FirstOrDefault() != null ? alternativeImagesList.FirstOrDefault().Value : string.Empty; alternativeImage = !string.IsNullOrEmpty(alternativeImage) ? "/Admin/Public/GetImage.ashx?width=" + 640 + "&image=" + alternativeImage + "&format=webp" : string.Empty; @* Badges *@ DateTime createdDate = product.Created.Value; bool showBadges = saleBadgeEnabled && product.Discount.Price != 0 ? true : false; showBadges = (newBadgeEnabled && Model.Item.GetInt32("NewPublicationDays") == 0) || (newBadgeEnabled && (createdDate.AddDays(Model.Item.GetInt32("NewPublicationDays")) > DateTime.Now)) ? true : showBadges; showBadges = !string.IsNullOrEmpty(Model.Item.GetRawValueString("CampaignBadges")) ? true : showBadges; @* Main features *@ IEnumerable<string> selectedDisplayGroups = Model.Item.GetList("MainFeatures")?.GetRawValue().OfType<string>().ToList(); List<CategoryFieldViewModel> mainFeatures = new List<CategoryFieldViewModel>(); foreach (var selection in selectedDisplayGroups) { foreach (CategoryFieldViewModel group in product.FieldDisplayGroups.Values) { if (selection == group.Id) { mainFeatures.Add(group); } } } <article class="position-relative@(productTheme) product-list-item js-product @liveInfoClass" data-product-id="@product.Id" data-variant-id="@product.VariantId" itemscope itemtype="https://schema.org/Product"> @if (!anonymousUser) { if (!hideFavoritesSelector) { <div class="position-absolute top-0 end-0 my-3" style="z-index: 2"> @RenderPartial("Components/ToggleFavorite.cshtml", product, favoriteParameters) </div> } } @if (showBadges) { <div class="position-absolute top-0 left-0 p-1 p-lg-2 ps-0 ps-lg-0" style="z-index: 2"> @RenderPartial("Components/EcommerceBadge.cshtml", product, badgeParms) </div> } <div class="d-flex flex-column d-block h-100"> @{ string clickProductLink = "onclick=\"return clickProductLink('" + @product.Id + "', '" + @Dynamicweb.Core.Encoders.HtmlEncoder.JavaScriptStringEncode(product.Name) + "', '" + @Dynamicweb.Core.Encoders.HtmlEncoder.JavaScriptStringEncode(product.VariantName) + "', '" + @product.Price.CurrencyCode + "', '" + @PriceViewModelExtensions.ToStringInvariant(product.Price) + "')\""; } <a href="@link" class="text-decoration-none d-flex flex-column" @clickProductLink> <script> function clickProductLink(productId, productName, productVariant, productCurrency, productPrice) { if (typeof gtag !== "undefined") { gtag("event", "select_item", { item_list_id: "product_list_gridview", item_list_name: "Product list (Gridview)", items: [ { item_id: productId, item_name: productName, currency: productCurrency, item_list_id: "product_list_gridview", item_list_name: "Product list (Gridview)", item_variant: productVariant, price: productPrice } ] }); } } </script> <div class="@productThemePadding order-2"> <div class="flex-grow-1"> <h3 class="h6 mb-0 text-break"> @product.Name @if (!string.IsNullOrEmpty(product.VariantName)) {<text>(@product.VariantName)</text>} </h3> @if (!Model.Item.GetBoolean("HideProductNumber")) { <p class="fs-7 opacity-85 mb-2">@product.Number</p> } @if (mainFeatures.Count > 0) { <ul class="p-0 lh-sm opacity-75" style="list-style-position: inside"> @foreach (CategoryFieldViewModel mainFeatureGroup in mainFeatures) { foreach (var field in mainFeatureGroup.Fields) { string fieldValue = field.Value.Value != null ? field.Value.Value.ToString() : string.Empty; if (fieldValue != string.Empty) { fieldValue = fieldValue == "False" ? Translate("No") : fieldValue; fieldValue = fieldValue == "True" ? Translate("Yes") : fieldValue; if (field.Value.Value.GetType() == typeof(System.Collections.Generic.List<FieldOptionValueViewModel>)) { fieldValue = string.Empty; List<string> options = new List<string>(); foreach (FieldOptionValueViewModel option in field.Value.Value as System.Collections.Generic.List<FieldOptionValueViewModel>) { if (!string.IsNullOrWhiteSpace(option.Value)) { if (option.Value.ToString().Contains("#") || option.Value.StartsWith("/Files/", StringComparison.OrdinalIgnoreCase) && (Translate(field.Value.Name) == Translate("Color") || Translate(field.Value.Name) == Translate("Colour"))) { string colorSpan = "<span class=\"colorbox-sm border\" style=\"background-color: " + option.Value + "\"></span>"; if (option.Value.StartsWith("/Files/", StringComparison.OrdinalIgnoreCase)) { colorSpan = $"<img src=\"/Admin/Public/GetImage.ashx?width=16&height=16&image={option.Value}\">"; } options.Add(colorSpan); } else { options.Add(option.Name); } } } string optionsString = (string.Join(", ", options.Select(x => x.ToString()).ToArray())); if ((Translate(field.Value.Name) == Translate("Color") || Translate(field.Value.Name) == Translate("Colour"))) { optionsString = (string.Join(" ", options.Select(x => x.ToString()).ToArray())); } fieldValue = optionsString; } if (!string.IsNullOrEmpty(fieldValue)) { <li>@(field.Value.Name): @fieldValue</li> } } } } </ul> } </div> @if (!hidePrice) { string priceMin = string.Empty; string priceMax = string.Empty; <div> <div> <span itemprop="priceCurrency" content="@product.Price.CurrencyCode" class="d-none"></span> @if (showPricesWithVat == "false" && !neverShowVat) { if (isLazyLoadingForProductInfoEnabled) { <span itemprop="price" content="" class="d-none"></span> <span class="text-decoration-line-through js-text-decoration-line-through opacity-75 me-3 text-price js-text-price d-none" data-show-if="LiveProductInfo.product.Price.Price != LiveProductInfo.product.PriceBeforeDiscount.Price"></span> } else { string beforePrice = product.PriceBeforeDiscount.PriceWithoutVatFormatted; <span itemprop="price" content="@product.Price.PriceWithoutVat" class="d-none"></span> if (product.Price.Price != product.PriceBeforeDiscount.Price) { <span class="text-decoration-line-through opacity-75 me-3 text-price">@beforePrice</span> } } } else { if (isLazyLoadingForProductInfoEnabled) { <span itemprop="price" content="" class="d-none"></span> <span class="text-decoration-line-through js-text-decoration-line-through opacity-75 me-3 text-price js-text-price d-none" data-show-if="LiveProductInfo.product.Price.Price != LiveProductInfo.product.PriceBeforeDiscount.Price"></span> } else { string beforePrice = product.PriceBeforeDiscount.PriceFormatted; <span itemprop="price" content="@product.Price.Price" class="d-none"></span> if (product.Price.Price != product.PriceBeforeDiscount.Price) { <span class="text-decoration-line-through opacity-75 me-3 text-price">@beforePrice</span> } } } @if (showPricesWithVat == "false" && !neverShowVat) { if (isLazyLoadingForProductInfoEnabled) { <span class="text-price js-text-price"><span class="spinner-border" role="status"></span></span> } else { string price = product.Price.PriceWithoutVatFormatted; if (product?.VariantInfo?.VariantInfo != null) { priceMin = product?.VariantInfo?.PriceMin?.PriceWithoutVatFormatted != null ? product.VariantInfo.PriceMin.PriceWithoutVatFormatted : ""; priceMax = product?.VariantInfo?.PriceMax?.PriceWithoutVatFormatted != null ? product.VariantInfo.PriceMax.PriceWithoutVatFormatted : ""; } if (priceMin != priceMax) { price = priceMin + " - " + priceMax; } <span class="text-price">@price</span> } } else { if (isLazyLoadingForProductInfoEnabled) { <span class="text-price js-text-price"><span class="spinner-border" role="status"></span></span> } else { string price = product.Price.PriceFormatted; if (product?.VariantInfo?.VariantInfo != null) { priceMin = product?.VariantInfo?.PriceMin?.PriceFormatted != null ? product.VariantInfo.PriceMin.PriceFormatted : ""; priceMax = product?.VariantInfo?.PriceMax?.PriceFormatted != null ? product.VariantInfo.PriceMax.PriceFormatted : ""; } if (priceMin != priceMax) { price = priceMin + " - " + priceMax; } <span class="text-price">@price</span> } } </div> @if (showPricesWithVat == "false" && !neverShowVat) { if (isLazyLoadingForProductInfoEnabled) { <div class="fs-7 opacity-85 text-price js-text-price-with-vat d-none" data-suffix="@Translate("Incl. VAT")"></div> } else { string price = product.Price.PriceWithVatFormatted; if (product?.VariantInfo?.VariantInfo != null) { priceMin = product?.VariantInfo?.PriceMin?.PriceWithVatFormatted != null ? product.VariantInfo.PriceMin.PriceWithVatFormatted : ""; priceMax = product?.VariantInfo?.PriceMax?.PriceWithVatFormatted != null ? product.VariantInfo.PriceMax.PriceWithVatFormatted : ""; } if (priceMin != priceMax) { price = priceMin + " - " + priceMax; } <div class="fs-7 opacity-85 text-price">@price @Translate("Incl. VAT")</div> } } </div> } @if (product.VariantInfo.VariantInfo != null && staticVariantsLayout == "swatches") { var optionCount = product.VariantInfo.VariantInfo.Count(); var showMaxVariants = 5; <div class="d-flex flex-row gap-1 align-items-center"> @foreach (VariantInfoViewModel variant in product.VariantInfo.VariantInfo.Take(showMaxVariants)) { <span class="colorbox colorbox-sm border rounded-circle border me-1" style="background-color: @variant.OptionColor"></span> } @if (optionCount > showMaxVariants) { int left = optionCount - showMaxVariants; <span class="ms-2">+@left</span> } </div> } </div> <div class="overflow-hidden order-1 @(imageTheme)" @imageOutlineStyle> <div class="ratio" style="@(ratioVariable)"> <div class="d-flex justify-content-center align-items-center"> @if (string.IsNullOrEmpty(alternativeImage)) { <img id="@imageId" srcset=" @imagePathXs 480w, @imagePathS 640w" sizes="(min-width: 992px) 33vw, 50vw" src="@imagePathFallBack" loading="lazy" decoding="async" class="mw-100 mh-100 @imageThemePadding" alt="@product.Name"> } else { <img id="@imageId" src="@imagePathFallBack" loading="lazy" decoding="async" class="mw-100 mh-100 @imageThemePadding" alt="@product.Name" onmouseover="this.src='@alternativeImage'" onmouseout="this.src='@imagePathFallBack'"> } </div> </div> @if (product.VariantInfo.VariantInfo != null && staticVariantsLayout == "images") { int variantGroupCount = 0; int showMaxVariantGroups = 2; int showMaxVariants = 3; var productVariantTheme = productTheme != string.Empty ? productTheme : "bg-white"; <div class="position-relative"> <div id="StaticVariants_@product.Id" class="static-variants w-100 d-none d-lg-block position-absolute left-0 bottom-0 @productTheme" style="pointer-events: none;"> @foreach (var variantGroup in product.VariantGroups()) { int variantsCount = 0; <div class="d-flex gap-2 mb-2"> @foreach (var variant in variantGroup.Options) { if (variantGroupCount < showMaxVariantGroups) { var optionsCount = variantGroup.Options.Count(); if (variantsCount < showMaxVariants) { string optionWidth = !string.IsNullOrEmpty(variant.Color) ? "w-25" : string.Empty; <article class="static-variants-option @optionWidth @(productVariantTheme)" title="@product.Name @variant.Name" style="pointer-events: initial;"> @if (!string.IsNullOrEmpty(variant.Color)) { string defaultProductImage = Dynamicweb.Context.Current.Server.UrlEncode(product.DefaultImage.Value); string variantImage = Dynamicweb.Context.Current.Server.UrlEncode(variant.Image.Value); string defaultPrice = !hidePrice ? product.Price.PriceFormatted : "0"; string variantPrice = !hidePrice ? product.Price.PriceFormatted : "0"; if (isLazyLoadingForProductInfoEnabled) { <figure class="w-100 d-block m-0" data-price-formatted="" onmouseover="swift.StaticVariants.SwitchProduct(event, '@product.Id', this.getAttribute('data-price-formatted'), '@variantImage')" onmouseout="swift.StaticVariants.SwitchProduct(event, '@product.Id', this.getAttribute('data-price-formatted'), '@defaultProductImage')"> <div class="d-flex align-items-center justify-content-center"> <img src="/admin/public/GetImage.ashx?image=@variantImage&width=75&height=75&crop=5&FillCanvas=true&format=webp" height="75" width="75" class="p-1 text-small" loading="lazy" decoding="async" alt="@product.Name, @variant.Name"> </div> </figure> } else { <figure class="w-100 d-block m-0" onmouseover="swift.StaticVariants.SwitchProduct(event, '@product.Id', '@defaultPrice', '@variantImage')" onmouseout="swift.StaticVariants.SwitchProduct(event, '@product.Id', '@variantPrice', '@defaultProductImage')"> <div class="d-flex align-items-center justify-content-center"> <img src="/admin/public/GetImage.ashx?image=@variantImage&width=75&height=75&crop=5&FillCanvas=true&format=webp" height="75" width="75" class="p-1 text-small" loading="lazy" decoding="async" alt="@product.Name, @variant.Name"> </div> </figure> } } else { <div class="d-flex align-items-center justify-content-center"> @variant.Name </div> } <div class="visually-hidden"> <h4>@product.Name, @variant.Name</h4> @if (!hidePrice) { if (isLazyLoadingForProductInfoEnabled) { <span class="text-price js-text-price"></span> } else { <span class="text-price">@product.Price.PriceFormatted</span> } } </div> </article> } variantsCount++; if (variantsCount == showMaxVariants && optionsCount != showMaxVariants) { int left = optionsCount - showMaxVariants; <div class="variant-option ms-1 d-flex justify-content-center align-items-center"> <span>+@left</span> </div> } } } </div> variantGroupCount++; } </div> </div> } </div> </a> </div> </article> } </div> <div class="my-3" id="LoadMoreButton"> <div class="text-center d-flex flex-column gap-3"> <div class="opacity-85">@loadedProducts @Translate("out of") @productList.TotalProductsCount @Translate("products")</div> @if (productList.PageCount != 1) { string sortBySelection = Dynamicweb.Context.Current.Request?.Form["SortBy"] ?? string.Empty; sortBySelection = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString.Get("SortBy")) ? Dynamicweb.Context.Current.Request.QueryString.Get("SortBy") : sortBySelection; string mainProductId = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString.Get("MainProductID")) ? Dynamicweb.Context.Current.Request.QueryString.Get("MainProductID") : string.Empty; string searchQuery = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString.Get("q")) ? Dynamicweb.Context.Current.Request.QueryString.Get("q") : string.Empty; searchQuery = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.Form.Get("q")) ? Dynamicweb.Context.Current.Request.Form.Get("q") : searchQuery; string searchLayout = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString.Get("SearchLayout")) ? Dynamicweb.Context.Current.Request.QueryString.Get("SearchLayout") : string.Empty; <form method="get" action="@url" data-response-target-element="content" class="w-100"> @foreach (FacetGroupViewModel facetGroup in productList.FacetGroups) { foreach (FacetViewModel facetItem in facetGroup.Facets) { foreach (FacetOptionViewModel facetOption in facetItem.Options) { if (facetOption.Selected) { <input type="hidden" name="@facetItem.QueryParameter" value="[@facetOption.Value]"> } } } } <input type="hidden" name="OriginalPageSize" value="@pageSizeSetting"> <input type="hidden" name="PageSize" value="@pageSize"> <input type="hidden" name="SortBy" value="@sortBySelection"> <input type="hidden" name="RequestType" value="UpdateList"> @if (!string.IsNullOrEmpty(searchQuery)) { <input type="hidden" name="q" value="@searchQuery"> <input type="hidden" name="SearchLayout" value="@searchLayout"> } @if (!string.IsNullOrEmpty(mainProductId)) { <input type="hidden" name="MainProductID" value="@mainProductId"> } @{ string nextPageLink = "/Default.aspx?ID=" + Pageview.Page.ID + "&PageSize=" + pageSize + "&SortBy=" + sortBySelection; foreach (FacetGroupViewModel facetGroup in productList.FacetGroups) { foreach (FacetViewModel facetItem in facetGroup.Facets) { foreach (FacetOptionViewModel facetOption in facetItem.Options) { if (facetOption.Selected) { nextPageLink += "&" + facetItem.QueryParameter + "=[" + facetOption.Value + "]"; } } } } nextPageLink += !string.IsNullOrEmpty(searchQuery) ? "&q=" + searchQuery : string.Empty; string disableLoadMore = isLazyLoadingForProductInfoEnabled ? "d-none" : string.Empty; } <a href="@nextPageLink" class="btn btn-primary swift_load_more_button @disableLoadMore" onclick="swift.ProductList.Update(event)" id="LoadMoreButton_@Model.ID">@Translate("Load more products")</a> </form> } </div> </div> } else { if (!Pageview.IsVisualEditorMode) { <div class="alert alert-dark m-0"> @Translate("We did not find anything matching your search result") </div> } else { <div class="alert alert-dark m-0" role="alert"> <span>@Translate("Product list: The list will be shown here, if any")</span> </div> } } </div> }
By clicking 'Accept All' you consent that we may collect information about you for various purposes, including: Statistics and Marketing