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 }