Lisätarvikkeet Braava
22 products
22 out of 22 products
Error executing template "Designs/Swift/Navigation/Navigation.cshtml" System.NullReferenceException: Object reference not set to an instance of an object. at CompiledRazorTemplates.Dynamic.RazorEngine_76c4191aa37247dc89937a2761abbf67.<>c__DisplayClass0_0.<RenderFirstLevelNodes>b__0(TextWriter __razor_helper_writer) in D:\DW9\Solutions\witt.dk\Files\Templates\Designs\Swift\Navigation\Navigation.cshtml:line 35 at CompiledRazorTemplates.Dynamic.RazorEngine_76c4191aa37247dc89937a2761abbf67.Execute() in D:\DW9\Solutions\witt.dk\Files\Templates\Designs\Swift\Navigation\Navigation.cshtml:line 14 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.Navigation.NavigationTreeViewModel> 2 @using Dynamicweb 3 @using System.IO 4 @using System.Text.RegularExpressions 5 6 @{ 7 string negativMargin = Model.Parameters["mx-n3"].ToString(); 8 string navOrientation = Model.Parameters["navOrientation"].ToString(); 9 string navAlignment = Model.Parameters["navAlignment"].ToString(); 10 string theme = !string.IsNullOrEmpty(Model.Parameters["theme"].ToString()) ? Model.Parameters["theme"].ToString() : ""; 11 } 12 13 <nav class="navbar navbar-expand d-none d-lg-flex nav-wrapper py-0 mx-n2 @navOrientation @navAlignment"> 14 @RenderFirstLevelNodes(Model.Nodes, theme, navOrientation) 15 </nav> 16 17 <nav class="navbar navbar-expand d-flex d-lg-none nav-wrapper py-0 mx-n2 @navOrientation @navAlignment"> 18 @RenderFirstLevelNodesMobile(Model.Nodes, navOrientation) 19 </nav> 20 21 @helper RenderFirstLevelNodes(IEnumerable<Dynamicweb.Frontend.Navigation.NavigationTreeNodeViewModel> nodes, string theme, string navOrientation) 22 { 23 string linkFontSize = Model.Parameters["LinkFontSize"].ToString(); 24 string linkFontWeight = Model.Parameters["LinkFontWeight"].ToString(); 25 string linkCasing = Model.Parameters["LinkCasing"].ToString(); 26 bool showOnlyFirstNavLevel = Model.Parameters.ContainsKey("ShowOnlyFirstNavLevel") ? Convert.ToBoolean(Model.Parameters["ShowOnlyFirstNavLevel"].ToString()) : false; 27 28 <ul class="navbar-nav @(navOrientation == "vertical" ? "flex-column" : navOrientation)"> 29 30 @foreach (var node in nodes) 31 { 32 var page = Dynamicweb.Services.Pages.GetPage(node.PageId); 33 string pageType = page.ItemType; 34 35 string preferencesLayout = page.Item["PreferencesLayout"] != null ? page.Item["PreferencesLayout"].ToString() : ""; 36 string preferencesType = "language"; 37 bool countrySelector = page.Item["CountrySelector"] != null ? Convert.ToBoolean(page.Item["CountrySelector"].ToString()) : false; 38 bool languageSelector = page.Item["LanguageSelector"] != null ? Convert.ToBoolean(page.Item["LanguageSelector"].ToString()) : false; 39 bool currencySelector = page.Item["CurrencySelector"] != null ? Convert.ToBoolean(page.Item["CurrencySelector"].ToString()) : false; 40 41 var hasChildren = node.Nodes.Count() > 0 || pageType == "Swift_SignIn"; 42 string dropdownAttributes = hasChildren ? " role=\"button\" data-bs-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\"" : ""; 43 44 if (pageType != "Swift_Preferences") 45 { 46 <li class="nav-item@(hasChildren ? " dropdown" : "")"> 47 @if (node.IsClickable) 48 { 49 <a class="nav-link nav-link-clean text-nowrap nav-link-underline @linkFontSize @linkFontWeight @linkCasing@(node.IsActive ? " active" : "")@(hasChildren ? " dropdown-toggle" : "")" href="@(hasChildren ? "#" : node.Link)" @dropdownAttributes @(node.IsActive ? " aria-current='page'" : "")> 50 @RenderNavigationItem(node) 51 </a> 52 } 53 else 54 { 55 <span class="nav-link nav-link-clean text-nowrap @linkFontSize @linkFontWeight @linkCasing" @dropdownAttributes> 56 @RenderNavigationItem(node) 57 </span> 58 } 59 60 @if (hasChildren) 61 { 62 if (!showOnlyFirstNavLevel) 63 { 64 <ul class="dropdown-menu @(theme)"> 65 @foreach (var subnode in node.Nodes)//Standard pages 66 { 67 <li> 68 <a href="@subnode.Link" class="dropdown-item py-2 nav-link-underline @linkFontSize @linkFontWeight @linkCasing" @(subnode.IsActive ? " aria-current='page'" : "")>@subnode.Name</a> 69 </li> 70 } 71 @if (pageType == "Swift_SignIn") //Sign out link 72 { 73 if (Pageview.User != null) 74 { 75 string link = "/Admin/Public/ExtranetLogoff.aspx?redirect=no"; 76 77 <li><hr class="dropdown-divider"></li> 78 if (Pageview.User.CurrentSecondaryUser != null) 79 { 80 <li> 81 <a href="Default.aspx?ID=@(Pageview.ID)&DwExtranetRemoveSecondaryUser=1" class="dropdown-item py-2 nav-link-underline @linkFontSize @linkFontWeight @linkCasing">@Translate("Sign out as a customer")</a> 82 </li> 83 } 84 <li> 85 <a href="@link" class="dropdown-item py-2 nav-link-underline @linkFontSize @linkFontWeight @linkCasing">@Translate("Sign out")</a> 86 </li> 87 } 88 } 89 </ul> 90 } 91 } 92 </li> 93 } 94 else 95 { 96 if (preferencesLayout == "modal") 97 { 98 99 string groupId = Dynamicweb.Context.Current.Request["GroupID"] != null ? Dynamicweb.Context.Current.Request["GroupID"].ToString() : ""; 100 string productId = Dynamicweb.Context.Current.Request["ProductID"] != null ? Dynamicweb.Context.Current.Request["ProductID"].ToString() : ""; 101 string variantId = Dynamicweb.Context.Current.Request["VariantID"] != null ? Dynamicweb.Context.Current.Request["VariantID"].ToString() : ""; 102 103 <li class="nav-item@(hasChildren ? " dropdown" : "")"> 104 <form action="/Default.aspx?ID=@node.PageId" data-response-target-element="PreferencesModalContent" data-layout-template="Swift_Preferences.cshtml" data-preloader="inline"> 105 <input type="hidden" name="CurrentPageID" value="@Pageview.ID" /> 106 <input type="hidden" name="GroupID" value="@groupId" /> 107 <input type="hidden" name="ProductID" value="@productId" /> 108 <input type="hidden" name="VariantID" value="@variantId" /> 109 <button type="button" onmouseover="swift.PageUpdater.Update(event)" onclick="swift.PageUpdater.Update(event)" class="btn nav-link nav-link-clean text-nowrap border-0 @linkFontSize @linkFontWeight @linkCasing" data-bs-toggle="modal" data-bs-target="#PreferencesModal"> 110 @if (languageSelector) 111 { 112 @RenderNavigationItem(node, "language") } 113 else 114 { 115 @RenderNavigationItem(node)} 116 </button> 117 </form> 118 </li> 119 } 120 else 121 { 122 var ecomCountries = Dynamicweb.Ecommerce.Services.Countries.GetCountries(); 123 var currencies = Dynamicweb.Ecommerce.Services.Currencies.GetAllCurrencies(); 124 125 if (languageSelector) 126 { 127 List<Dynamicweb.Content.Page> languages = new List<Dynamicweb.Content.Page>(); 128 129 if (Pageview.Page.Area.IsMaster) 130 { 131 languages.Add(Pageview.Page); 132 if (Pageview.Page.Languages != null) 133 { 134 foreach (var language in Pageview.Page.Languages) 135 { 136 if (language.Area.Active == true) 137 { 138 languages.Add(language); 139 } 140 } 141 } 142 } 143 else 144 { 145 languages.Add(Pageview.Page.MasterPage); 146 if (Pageview.Page.MasterPage != null) 147 { 148 if (Pageview.Page.MasterPage.Languages != null) 149 { 150 foreach (var language in Pageview.Page.MasterPage.Languages) 151 { 152 if (language.Area.Active == true) 153 { 154 languages.Add(language); 155 } 156 } 157 } 158 } 159 } 160 161 if (languages.Count > 1) 162 { 163 preferencesType = "language"; 164 165 @RenderPreferencesDropdown(node, preferencesType, linkFontSize, linkFontWeight, linkCasing, theme) } 166 } 167 if (countrySelector && ecomCountries.Count > 1) 168 { 169 preferencesType = "country"; 170 @RenderPreferencesDropdown(node, preferencesType, linkFontSize, linkFontWeight, linkCasing, theme) } 171 if (currencySelector && currencies.Count() > 1) 172 { 173 preferencesType = "currency"; 174 @RenderPreferencesDropdown(node, preferencesType, linkFontSize, linkFontWeight, linkCasing, theme)} 175 } 176 } 177 } 178 </ul> 179 } 180 181 @helper RenderFirstLevelNodesMobile(IEnumerable<Dynamicweb.Frontend.Navigation.NavigationTreeNodeViewModel> nodes, string navOrientation) 182 { 183 string linkFontSize = Model.Parameters["LinkFontSize"].ToString(); 184 string linkFontWeight = Model.Parameters["LinkFontWeight"].ToString(); 185 string linkCasing = Model.Parameters["LinkCasing"].ToString(); 186 187 <div class="navbar-nav @(navOrientation == "vertical" ? "flex-column" : navOrientation)"> 188 @foreach (var node in nodes) 189 { 190 var hasChildren = node.Nodes.Count() > 0; 191 var page = Dynamicweb.Services.Pages.GetPage(node.PageId); 192 string pageType = page.ItemType; 193 194 if (pageType != "Swift_Preferences") 195 { 196 if (node.IsClickable) 197 { 198 <a class="nav-link nav-link-clean text-nowrap @linkFontWeight @linkCasing @linkFontSize @(node.IsActive ? " active" : "")" href="@node.Link" title="@node.Name"> 199 @RenderNavigationItem(node) 200 </a> 201 } 202 else 203 { 204 <span class="nav-link nav-link-clean text-nowrap @linkFontWeight @linkCasing @linkFontSize" title="@node.Name"> 205 @RenderNavigationItem(node) 206 </span> 207 } 208 } else { 209 bool languageSelector = page.Item["LanguageSelector"] != null ? Convert.ToBoolean(page.Item["LanguageSelector"].ToString()) : false; 210 string groupId = Dynamicweb.Context.Current.Request["GroupID"] != null ? Dynamicweb.Context.Current.Request["GroupID"].ToString() : ""; 211 string productId = Dynamicweb.Context.Current.Request["ProductID"] != null ? Dynamicweb.Context.Current.Request["ProductID"].ToString() : ""; 212 string variantId = Dynamicweb.Context.Current.Request["VariantID"] != null ? Dynamicweb.Context.Current.Request["VariantID"].ToString() : ""; 213 214 <div class="nav-item"> 215 <form action="/Default.aspx?ID=@node.PageId" data-response-target-element="PreferencesModalContent" data-layout-template="Swift_Preferences.cshtml" data-preloader="inline"> 216 <input type="hidden" name="Layout" value="modal" /> 217 <input type="hidden" name="CurrentPageID" value="@Pageview.ID" /> 218 <input type="hidden" name="GroupID" value="@groupId" /> 219 <input type="hidden" name="ProductID" value="@productId" /> 220 <input type="hidden" name="VariantID" value="@variantId" /> 221 <button type="button" onmouseover="swift.PageUpdater.Update(event)" onclick="swift.PageUpdater.Update(event)" class="btn nav-link nav-link-clean text-nowrap border-0 @linkFontSize @linkFontWeight @linkCasing" data-bs-toggle="modal" data-bs-target="#PreferencesModal"> 222 @if (languageSelector) 223 { 224 @RenderNavigationItem(node, "language") } 225 else 226 { 227 @RenderNavigationItem(node)} 228 </button> 229 </form> 230 </div> 231 } 232 } 233 </div> 234 } 235 236 @helper RenderNavigationItem(Dynamicweb.Frontend.Navigation.NavigationTreeNodeViewModel node, string preferencesType = "") 237 { 238 var page = Dynamicweb.Services.Pages.GetPage(node.PageId); 239 string pageType = page.ItemType; 240 string linkFontSize = Model.Parameters["LinkFontSize"].ToString(); 241 string layout = Model?.Parameters["Layout"].ToString(); 242 string icon = page.Item["Icon"] != null ? page.Item["Icon"].ToString() : ""; 243 string iconSize = "icon-3"; 244 245 if (linkFontSize == "fs-7") 246 { 247 iconSize = "icon-2"; 248 } 249 if (linkFontSize == "fs-5") 250 { 251 iconSize = "icon-4"; 252 } 253 254 if (page.PropertyItem != null) 255 { 256 icon = page.PropertyItem["Icon"] != null ? page.PropertyItem["Icon"].ToString() : ""; 257 } 258 259 if (pageType == "Swift_Cart") //Mini cart 260 { 261 double totalProducts = 0; 262 263 if (Dynamicweb.Ecommerce.Common.Context.Cart != null) 264 { 265 totalProducts = Dynamicweb.Ecommerce.Common.Context.Cart.GetParentProductLineQuantityCount(Dynamicweb.Ecommerce.Common.Context.Cart.OrderLines); 266 } 267 268 switch (layout) 269 { 270 case "linksOnly": 271 <span class="align-middle">@node.Name</span> 272 <span class="js-cart-qty mini-cart-quantity align-middle">(@totalProducts)</span> 273 break; 274 275 case "iconsOnly": 276 @RenderIcon(icon, iconSize) 277 <span class="js-cart-qty mini-cart-quantity align-middle">(@totalProducts)</span> 278 break; 279 case "iconsAndLinks": 280 @RenderIcon(icon, iconSize) 281 <span class="js-cart-qty mini-cart-quantity align-middle">(@totalProducts)</span> 282 <span class="align-middle">@node.Name</span> 283 break; 284 case "linksAndIcons": 285 <span class="align-middle">@node.Name</span> 286 <span class="js-cart-qty mini-cart-quantity align-middle">(@totalProducts)</span> 287 @RenderIcon(icon, iconSize) 288 break; 289 } 290 } 291 else 292 { 293 string name = node.Name; 294 295 if (preferencesType == "country") 296 { //Country 297 name = Translate("Deliver to") + ": " + Dynamicweb.Ecommerce.Common.Context.Country.Name; 298 } 299 300 if (preferencesType == "language") 301 { //Languange 302 string iconFolder = "/Files/FlagIcons/"; 303 icon = iconFolder + Pageview.Area.CultureInfo.Name.ToLower() + ".svg"; 304 Regex reg = new Regex(@"\(([^\)]+)\)"); 305 name = reg.Replace(Pageview.Area.CultureInfo.DisplayName, ""); 306 307 layout = layout == "linksOnly" ? "iconsAndLinks" : layout; 308 bool hideIcon = page.Item["HideIcon"] != null ? Convert.ToBoolean(page.Item["HideIcon"].ToString()) : false; 309 bool hideName = page.Item["HideName"] != null ? Convert.ToBoolean(page.Item["HideName"].ToString()) : false; 310 layout = hideIcon ? "linksOnly" : layout; 311 layout = hideName ? "iconsOnly" : layout; 312 } 313 314 if (preferencesType == "currency") 315 { //Country 316 name = Dynamicweb.Ecommerce.Common.Context.Currency.Code; 317 } 318 319 switch (layout) 320 { 321 case "linksOnly": 322 <span class="align-middle">@name</span> 323 break; 324 325 case "iconsOnly": 326 <span class="visually-hidden">@name</span> 327 @RenderIcon(icon, iconSize) 328 break; 329 case "iconsAndLinks": 330 @RenderIcon(icon, iconSize) 331 <span class="align-middle">@name</span> 332 break; 333 case "linksAndIcons": 334 <span class="align-middle">@name</span> 335 @RenderIcon(icon, iconSize) 336 break; 337 } 338 } 339 } 340 341 @helper RenderPreferencesDropdown(Dynamicweb.Frontend.Navigation.NavigationTreeNodeViewModel node, string preferencesType, string linkFontSize, string linkFontWeight, string linkCasing, string theme) 342 { 343 string groupId = Dynamicweb.Context.Current.Request["GroupID"] != null ? Dynamicweb.Context.Current.Request["GroupID"].ToString() : ""; 344 string productId = Dynamicweb.Context.Current.Request["ProductID"] != null ? Dynamicweb.Context.Current.Request["ProductID"].ToString() : ""; 345 string variantId = Dynamicweb.Context.Current.Request["VariantID"] != null ? Dynamicweb.Context.Current.Request["VariantID"].ToString() : ""; 346 347 <li class="nav-item dropdown"> 348 <form class="d-none d-lg-block" action="/Default.aspx?ID=@node.PageId" data-response-target-element="@(preferencesType)Dropdown_@Pageview.CurrentParagraph.ID" data-layout-template="Swift_Preferences.cshtml" data-preloader="inline"> 349 <input type="hidden" name="Type" value="@preferencesType" /> 350 <input type="hidden" name="CurrentPageID" value="@Pageview.ID" /> 351 <input type="hidden" name="GroupID" value="@groupId" /> 352 <input type="hidden" name="ProductID" value="@productId" /> 353 <input type="hidden" name="VariantID" value="@variantId" /> 354 <input type="hidden" name="FontSize" value="@linkFontSize" /> 355 <input type="hidden" name="FontWeight" value="@linkFontWeight" /> 356 <input type="hidden" name="Casing" value="@linkCasing" /> 357 358 <a onmouseover="swift.PageUpdater.Update(event)" onclick="swift.PageUpdater.Update(event)" class="nav-link nav-link-clean text-nowrap nav-link-underline @linkFontSize @linkFontWeight @linkCasing@(node.IsActive ? " active" : "") dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" @(node.IsActive ? " aria-current='page'" : "")> 359 @RenderNavigationItem(node, preferencesType) 360 </a> 361 362 <ul class="dropdown-menu @(theme)" id="@(preferencesType)Dropdown_@Pageview.CurrentParagraph.ID"> 363 @* The content here comes from an external request *@ 364 </ul> 365 </form> 366 367 <form class="d-block d-lg-none" action="/Default.aspx?ID=@node.PageId" data-response-target-element="PreferencesModalContent" data-layout-template="Swift_Preferences.cshtml" data-preloader="inline"> 368 <input type="hidden" name="Layout" value="modal" /> 369 <input type="hidden" name="CurrentPageID" value="@Pageview.ID" /> 370 <input type="hidden" name="GroupID" value="@groupId" /> 371 <input type="hidden" name="ProductID" value="@productId" /> 372 <input type="hidden" name="VariantID" value="@variantId" /> 373 <button type="button" onmouseover="swift.PageUpdater.Update(event)" onclick="swift.PageUpdater.Update(event)" class="btn nav-link nav-link-clean text-nowrap border-0 @linkFontSize @linkFontWeight @linkCasing" data-bs-toggle="modal" data-bs-target="#PreferencesModal"> 374 @RenderNavigationItem(node, preferencesType) 375 </button> 376 </form> 377 </li> 378 } 379 380 @helper RenderIcon(string icon, string iconSize) 381 { 382 if (Path.GetExtension(icon).ToLower() == ".svg" && !icon.ToLower().Contains("none")) 383 { 384 string iconPath = Dynamicweb.Context.Current.Server.MapPath(icon); 385 386 <span class="@iconSize"> 387 @ReadFile(iconPath) 388 </span> 389 } 390 } 391