Navigation

Error executing template "Designs/Swift/Navigation/Vertical.cshtml"
System.ArgumentException: An item with the same key has already been added. Key: GROUP3206
at System.Collections.Generic.Dictionary`2.TryInsert(TKey key, TValue value, InsertionBehavior behavior)
at Dynamicweb.Ecommerce.Products.GroupService.GetSubgroups(Group group, Boolean showUnTranslated)
at Dynamicweb.Ecommerce.Frontend.Navigation.GroupNavigationTreeNodeProvider.GetNodes(NavigationContext context, NavigationSettings settings, NavigationTreeNode parent)
at System.Linq.Enumerable.SelectManySingleSelectorIterator`2.MoveNext()
at System.Linq.Enumerable.SelectEnumerableIterator`2.GetCount(Boolean onlyIfCheap)
at CompiledRazorTemplates.Dynamic.RazorEngine_6bcd510793fd40149de66c670ae33843.<ExecuteAsync>g__RenderNode|0_0(NavigationTreeNodeViewModel treeNode, Dictionary`2 nodeParams)
at CompiledRazorTemplates.Dynamic.RazorEngine_6bcd510793fd40149de66c670ae33843.<ExecuteAsync>g__RenderNode|0_0(NavigationTreeNodeViewModel treeNode, Dictionary`2 nodeParams)
at CompiledRazorTemplates.Dynamic.RazorEngine_6bcd510793fd40149de66c670ae33843.<ExecuteAsync>g__RenderNode|0_0(NavigationTreeNodeViewModel treeNode, Dictionary`2 nodeParams)
at CompiledRazorTemplates.Dynamic.RazorEngine_6bcd510793fd40149de66c670ae33843.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.Navigation.NavigationTreeViewModel> 2 @using Dynamicweb 3 @using System.IO 4 @using Dynamicweb.Ecommerce.ProductCatalog 5 @using Dynamicweb.Frontend.Navigation 6 7 @{ 8 string currentPageTitle = Translate("Navigation"); 9 10 if (Pageview.Page?.Item != null) 11 { 12 currentPageTitle = Pageview.Page.Item["Title"] != null ? Pageview.Page.Item["Title"].ToString() : currentPageTitle; 13 } 14 15 string layoutSetting = Model.Parameters.ContainsKey("Layout") ? Model.Parameters["Layout"].ToString().ToLower() : "clean"; 16 string contentPadding = Model.Parameters.ContainsKey("ContentPadding") ? Model.Parameters["ContentPadding"].ToString().ToLower() : string.Empty; 17 bool hideTexts = Model.Parameters.ContainsKey("HideTexts") ? Convert.ToBoolean(Model.Parameters["HideTexts"].ToString()) : false; 18 bool hideIcons = Model.Parameters.ContainsKey("HideIcons") ? Convert.ToBoolean(Model.Parameters["HideIcons"].ToString()) : false; 19 bool showGroupIcons = Model.Parameters.ContainsKey("ShowGroupIcons") ? Convert.ToBoolean(Model.Parameters["ShowGroupIcons"].ToString()) : false; 20 21 string linesLayout = layoutSetting == "lines" ? " border-top" : string.Empty; 22 string small = layoutSetting == "small" ? " fs-7" : string.Empty; 23 24 bool showSignOutLink = Model.Parameters.ContainsKey("ShowSignOutLink") ? Convert.ToBoolean(Model.Parameters["ShowSignOutLink"].ToString()) : false; 25 string signOutLink = "/Admin/Public/ExtranetLogoff.aspx?redirect=no"; 26 27 string paragraphId = Pageview.CurrentParagraph.ID.ToString(); 28 string menuId = Model.Parameters.ContainsKey("menu-id") ? $"menu_{Model.Parameters["menu-id"].ToString().ToLower()}" : string.Empty; 29 string linesLayoutCssClasses = layoutSetting == "lines" ? "d-none d-lg-block" : string.Empty; 30 31 int nodeCount = 0; 32 33 var nodesParms = new Dictionary<string, object>(); 34 nodesParms.Add("IsSubmenu", false); 35 nodesParms.Add("Layout", layoutSetting); 36 nodesParms.Add("ContentPadding", contentPadding); 37 nodesParms.Add("HideTexts", hideTexts); 38 nodesParms.Add("HideIcons", hideIcons); 39 nodesParms.Add("ShowGroupIcons", showGroupIcons); 40 nodesParms.Add("NodeCount", nodeCount); 41 } 42 43 <div class="@linesLayoutCssClasses"> 44 <ul class="navbar-nav flex-column flex-fill @menuId"> 45 @foreach (var node in Model.Nodes) 46 { 47 nodesParms["NodeCount"] = nodeCount; 48 RenderNode(node, nodesParms); 49 nodeCount++; 50 } 51 @if (showSignOutLink && Pageview.User != null) 52 { 53 if (Dynamicweb.Security.UserManagement.User.GetCurrentSecondaryUser() != null) 54 { 55 <li class="nav-item@(linesLayout)"> 56 <a href="Default.aspx?ID=@(Pageview.ID)&DwExtranetRemoveSecondaryUser=1" class="nav-link text-reset swift_sign-out-as-customer-link @(contentPadding)@(small)">@Translate("Sign out as a customer")</a> 57 </li> 58 } 59 <li class="nav-item@(linesLayout)"> 60 <a href="@signOutLink" class="nav-link text-reset swift_sign-out-link @(contentPadding)@(small)">@Translate("Sign out")</a> 61 </li> 62 } 63 </ul> 64 </div> 65 66 @* Mobile navigation for Lines layout *@ 67 @if (layoutSetting == "lines") 68 { 69 <div class="d-block d-lg-none"> 70 <div class="collapsed" data-bs-toggle="collapse" data-bs-target="#VerticalNavigation_@paragraphId" role="button" aria-expanded="true" aria-controls="Navigation"> 71 <div class="d-flex@(contentPadding)"> 72 <h6 class="fw-bold m-0 flex-fill"> 73 @if (string.IsNullOrEmpty(currentPageTitle)) 74 { 75 @Translate("Navigation") 76 } 77 else 78 { 79 @currentPageTitle 80 } 81 </h6> 82 <div class="my-auto collapse-chevron-icon"></div> 83 </div> 84 </div> 85 <div class="collapse hide" id="VerticalNavigation_@paragraphId"> 86 <div class="navbar navbar-expand py-0"> 87 <ul class="navbar-nav flex-column flex-fill @menuId"> 88 @foreach (var node in Model.Nodes) 89 { 90 nodesParms["NodeCount"] = nodeCount; 91 @RenderPartial("Navigation/Vertical/NavItem.cshtml", node, nodesParms) 92 nodeCount++; 93 } 94 @if (showSignOutLink && Pageview.User != null) 95 { 96 if (Dynamicweb.Security.UserManagement.User.GetCurrentSecondaryUser() != null) 97 { 98 <li class="nav-item@(linesLayout)"> 99 <a href="Default.aspx?ID=@(Pageview.ID)&DwExtranetRemoveSecondaryUser=1" class="nav-link text-reset swift_sign-out-as-customer-link @(contentPadding)@(small)">@Translate("Sign out as a customer")</a> 100 </li> 101 } 102 <li class="nav-item@(linesLayout)"> 103 <a href="@signOutLink" class="nav-link text-reset swift_sign-out-link @(contentPadding)@(small)">@Translate("Sign out")</a> 104 </li> 105 } 106 </ul> 107 </div> 108 </div> 109 </div> 110 } 111112113 @{ 114 void RenderNode(NavigationTreeNodeViewModel treeNode, Dictionary<string, object> nodeParams) 115 { 116 bool isSubmenu = GetViewParameterString("IsSubmenu") != null ? GetViewParameterBoolean("IsSubmenu") : false; 117118 string contentPadding = nodeParams["ContentPadding"].ToString(); 119 string layoutSetting = nodeParams["Layout"].ToString(); 120 bool hideTexts = Convert.ToBoolean(nodeParams["HideTexts"]); 121 bool hideIcons = Convert.ToBoolean(nodeParams["HideIcons"]); 122 bool showGroupIcons = Convert.ToBoolean(nodeParams["ShowGroupIcons"]); 123 int nodeCount = Convert.ToInt32(nodeParams["NodeCount"]); 124 nodeCount++; 125126 string small = layoutSetting == "small" ? " fs-7" : string.Empty; 127128 string linesLayout = layoutSetting == "lines" && isSubmenu == false ? " border-top" : string.Empty; 129 linesLayout = layoutSetting == "lines" && isSubmenu == false && nodeCount == (1) ? string.Empty : linesLayout; 130131 // var nodesParms = new Dictionary<string, object>(); 132 // nodesParms.Add("IsSubmenu", true); 133 // nodesParms.Add("Layout", layoutSetting); 134 // nodesParms.Add("ContentPadding", contentPadding); 135 // nodesParms.Add("HideTexts", hideTexts); 136 // nodesParms.Add("HideIcons", hideIcons); 137 // nodesParms.Add("ShowGroupIcons", showGroupIcons); 138 // nodesParms.Add("NodeCount", nodeCount); 139140 var hasChildren = treeNode.Nodes.Count() > 0; 141 string groupId = !string.IsNullOrEmpty(treeNode.GroupId) ? treeNode.GroupId : treeNode.PageId.ToString(); 142143 var page = Dynamicweb.Content.Services.Pages.GetPage(treeNode.PageId); 144 string icon = string.Empty; 145 if (page.PropertyItem != null) 146 { 147 icon = page.PropertyItem["Icon"] != null ? page.PropertyItem["Icon"].ToString() : string.Empty; 148 } 149150 var group = treeNode.GetProductGroup(); 151 IList<FieldValueViewModel> groupFields = group.GroupFields != null ? group.GroupFields : null; 152153 string productGroupImageShape = string.Empty; 154 string productGroupImageSize = "40"; 155 <li class="nav-item@(linesLayout)@(treeNode.IsActive ? " active" : string.Empty) @(treeNode.InPath ? " inPath" : "")"> 156 <div class="d-flex align-items-center"> 157 <a class="nav-link flex-fill text-reset@(contentPadding)@(small)" @(treeNode.IsActive ? "aria-current='page'" : string.Empty) href="@treeNode.Link"> 158 @if (!hideIcons) 159 { 160 if (Path.GetExtension(icon).ToLower() == ".svg" && !icon.ToLower().Contains("none")) 161 { 162 <span class="icon-3 me-1"> 163 @ReadFile(icon) 164 </span> 165 } 166 } 167168 @if (showGroupIcons && !string.IsNullOrEmpty(treeNode.GroupId) && groupFields != null) 169 { 170 foreach (FieldValueViewModel field in groupFields) 171 { 172 if (field.SystemName == "ProductGroupNavigationImage" && !string.IsNullOrEmpty(field.Value.ToString())) 173 { 174 var groupImage = field.Value.ToString(); 175176 if (Path.GetExtension(groupImage).ToLower() == ".svg") 177 { 178 <span class="me-2 icon-auto @productGroupImageShape" style="height: @(productGroupImageSize)px; width: @(productGroupImageSize)px;"> 179 @ReadFile("/Files/Images/" + groupImage) 180 </span> 181 } 182 else 183 { 184 var imagePath = "/Admin/Public/GetImage.ashx?Image=" + "/Files/Images/" + Dynamicweb.Context.Current.Server.UrlEncode(groupImage) + "&Width=" + productGroupImageSize + "&Height=" + productGroupImageSize + "&crop=0"; 185 <img loading="lazy" class="me-2 @productGroupImageShape" alt="@group.Name" width="@productGroupImageSize" height="@productGroupImageSize" src="@imagePath"> 186 } 187 } 188 } 189 } 190 @if (!hideTexts) 191 { 192 <span class="@(treeNode.IsActive ? "fw-bold" : string.Empty)">@treeNode.Name</span> 193 } 194 </a> 195 @if (hasChildren) 196 { 197 string collapseCSS = treeNode.InPath ? string.Empty : "collapsed "; 198 string collapseIconStyle = contentPadding == " px-0 py-2" ? collapseIconStyle = "style=" + "-webkit-mask-position:right;mask-position:right;" : string.Empty; 199 <div class="@(collapseCSS)m-0 collapse-icon@(small)@(contentPadding)" @collapseIconStyle data-bs-toggle="collapse" data-bs-target="#NavigationGroup_@(groupId)_@(nodeCount)" role="button" aria-expanded="true" aria-controls="NavigationGroup_@(groupId)_@(nodeCount)"></div> 200 } 201 </div> 202 @if (hasChildren) 203 { 204 string collapsed = treeNode.InPath ? "show" : string.Empty; 205206 <div class="ms-3 collapse @collapsed" id="NavigationGroup_@(groupId)_@(nodeCount)"> 207 <ul class="navbar-nav flex-column flex-fill"> 208 @foreach (var subnode in treeNode.Nodes) 209 { 210 RenderNode(subnode, nodeParams); 211 } 212 </ul> 213 </div> 214 } 215 </li> 216217 } 218 }
Flow Regulator
Flow Regulator

Flow Regulator

€327.01 - €1,357.72Available in stock
Flow Regulator Spare Parts
Flow Regulator Spare Parts

Flow Regulator Spare Parts

€0.25 - €163.84Available in stock
2 out of 2 products