Error executing template "Designs/Swift/_parsed/Swift_Preferences.parsed.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
   at CompiledRazorTemplates.Dynamic.RazorEngine_5e69d5763f974a90a25b8b91d2d1bdc0.Execute() in E:\Dynamicweb.Net\Solutions\Dynamicweb\dansukker.prod\Swift-Files\Templates\Designs\Swift\_parsed\Swift_Preferences.parsed.cshtml:line 209
   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.PageViewModel> 2 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 3 @using System 4 @using System.Text.RegularExpressions 5 @using System.IO 6 7 8 9 @{ 10 string layout = Model.Item.GetRawValueString("PreferencesLayout", "modal"); 11 layout = Dynamicweb.Context.Current.Request["Layout"] != null ? Dynamicweb.Context.Current.Request["Layout"] : layout; 12 layout = layout == "" ? "modal" : layout; 13 string type = Dynamicweb.Context.Current.Request["Type"] != null ? Dynamicweb.Context.Current.Request["Type"] : "language"; 14 15 string groupId = Dynamicweb.Context.Current.Request["GroupID"] != null ? Dynamicweb.Context.Current.Request["GroupID"].ToString() : ""; 16 string productId = Dynamicweb.Context.Current.Request["ProductID"] != null ? Dynamicweb.Context.Current.Request["ProductID"].ToString() : ""; 17 string variantId = Dynamicweb.Context.Current.Request["VariantID"] != null ? Dynamicweb.Context.Current.Request["VariantID"].ToString() : ""; 18 19 string linkFontSize = Dynamicweb.Context.Current.Request["FontSize"] != null ? Dynamicweb.Context.Current.Request["FontSize"].ToString() : ""; 20 string linkFontWeight = Dynamicweb.Context.Current.Request["FontWeight"] != null ? Dynamicweb.Context.Current.Request["FontWeight"].ToString() : ""; 21 string linkCasing = Dynamicweb.Context.Current.Request["Casing"] != null ? Dynamicweb.Context.Current.Request["Casing"].ToString() : ""; 22 23 Regex reg = new Regex(@"\(([^\)]+)\)"); 24 List<Dynamicweb.Content.Page> languages = new List<Dynamicweb.Content.Page>(); 25 26 int pageId = Dynamicweb.Context.Current.Request["CurrentPageID"] != null ? Convert.ToInt32(Dynamicweb.Context.Current.Request["CurrentPageID"]) : Pageview.ID; 27 var currentPage = Dynamicweb.Services.Pages.GetPage(pageId); //Get the correct page instance 28 29 if (currentPage.Area.IsMaster) { 30 languages.Add(currentPage); 31 if (currentPage.Languages != null) { 32 foreach (var language in currentPage.Languages) { 33 if (language.Area.Active == true) { 34 languages.Add(language); 35 } 36 } 37 } 38 } else { 39 languages.Add(currentPage.MasterPage); 40 if (currentPage.MasterPage != null) { 41 if (currentPage.MasterPage.Languages != null) { 42 foreach (var language in currentPage.MasterPage.Languages) { 43 if (language.Area.Active == true) { 44 languages.Add(language); 45 } 46 } 47 } 48 } 49 } 50 51 languages = languages.Count > 1 ? languages.OrderBy(language => language.Area.CultureInfo.DisplayName).ToList() : languages; 52 53 string siteLanguage = Pageview.Area.CultureInfo.Name; 54 Uri url = Dynamicweb.Context.Current.Request.Url; 55 string hostName = url.Host; // domain.com/da-dk or domain.com/en-us 56 57 var ecomCountries = Dynamicweb.Ecommerce.Services.Countries.GetCountries() != null ? Dynamicweb.Ecommerce.Services.Countries.GetCountries().OrderBy(country => country.Name) : null; 58 var currencies = Dynamicweb.Ecommerce.Services.Currencies.GetAllCurrencies() != null ? Dynamicweb.Ecommerce.Services.Currencies.GetAllCurrencies().OrderBy(currency => currency.Code) : null; 59 60 string modalTheme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("ModalTheme")) ? " theme " + Model.Item.GetRawValueString("ModalTheme").Replace(" ", "").Trim().ToLower() : ""; 61 } 62 63 64 @* Modal *@ 65 66 @if (layout == "modal") 67 { 68 int updatePageId = pageId; 69 70 <div class="modal-content @modalTheme"> 71 <div class="modal-header"> 72 <h5 class="modal-title" id="PreferencesModalLabel">@Translate("Preferences")</h5> 73 <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> 74 </div> 75 <div class="modal-body d-grid gap-3" id="PreferencesModalBody"> 76 <input type="hidden" name="CurrentPageID" value="@pageId" /> 77 @if (groupId != "") { 78 <input type="hidden" name="GroupID" value="@groupId" /> 79 } 80 81 @if (productId != "") { 82 <input type="hidden" name="ProductID" value="@productId" /> 83 } 84 85 @if (variantId != "") { 86 <input type="hidden" name="VariantID" value="@variantId" /> 87 } 88 89 90 @if (languages.Count() > 1 && Model.Item.GetBoolean("LanguageSelector")) 91 { 92 <form action="/Default.aspx" data-response-target-element="PreferencesModalContent" data-layout-template="Swift_Preferences.cshtml" data-preloader="inline"> 93 <input type="hidden" name="Layout" value="modal" /> 94 <input type="hidden" name="CurrentPageID" value="@pageId" /> 95 <input type="hidden" name="GroupID" value="@groupId" /> 96 <input type="hidden" name="ProductID" value="@productId" /> 97 <input type="hidden" name="VariantID" value="@variantId" /> 98 99 <div class="form-floating"> 100 <select id="LanguageSelect" name="ID" class="form-select d-col-12" aria-label="@Translate("Select language")" onchange="swift.PageUpdater.Update(event)"> 101 @foreach (var language in languages) 102 { 103 string name = reg.Replace(language.Area.CultureInfo.DisplayName, ""); 104 string selectedLanguage = language.Area.ID == Pageview.Area.ID ? "selected" : ""; 105 updatePageId = language.Area.ID == Pageview.Area.ID ? language.ID : updatePageId; 106 107 var masterPageId = Pageview.Page?.MasterPageId != null && Pageview.Page.MasterPageId != 0 ? Pageview.Page.MasterPageId : Pageview.ID; 108 var preferencePageId = Dynamicweb.Services.Pages.GetPageIDByMasterID(masterPageId, language.AreaId); 109 preferencePageId = preferencePageId == 0 ? Pageview.Page.MasterPageId : preferencePageId; 110 preferencePageId = preferencePageId == 0 ? Pageview.Page.ID : preferencePageId; 111 112 <option hreflang="@language.Area.CultureInfo.TwoLetterISOLanguageName" value="@preferencePageId" @selectedLanguage>@name</option> 113 } 114 </select> 115 <label for="LanguageSelect">@Translate("Language")</label> 116 </div> 117 </form> 118 } 119 120 @if (ecomCountries.Count() > 1 && Model.Item.GetBoolean("CountrySelector")) 121 { 122 <form action="/Default.aspx" data-response-target-element="PreferencesModalContent" data-layout-template="Swift_Preferences.cshtml" data-preloader="inline"> 123 <input type="hidden" name="ID" value="@Pageview.ID" /> 124 <input type="hidden" name="CurrentPageID" value="@pageId" /> 125 <input type="hidden" name="GroupID" value="@groupId" /> 126 <input type="hidden" name="ProductID" value="@productId" /> 127 <input type="hidden" name="VariantID" value="@variantId" /> 128 129 <div class="form-floating"> 130 <select name="CountryCode" id="CountryCodeSelect" class="form-select d-col-12" aria-label="@Translate("Select country")" onchange="swift.PageUpdater.Update(event)"> 131 @foreach (var country in ecomCountries) 132 { 133 var selectedCountry = country.Code2 == Dynamicweb.Ecommerce.Common.Context.Country.Code2 ? "selected" : ""; 134 135 if (!string.IsNullOrEmpty(country.Name)) { 136 <option value="@country.Code2" @selectedCountry>@country.Name</option> 137 } 138 } 139 </select> 140 <label for="CountryCodeSelect">@Translate("Delivery country")</label> 141 </div> 142 </form> 143 } 144 145 @if (currencies.Count() > 1 && Model.Item.GetBoolean("CurrencySelector")) 146 { 147 <form action="/Default.aspx" data-response-target-element="PreferencesModalContent" data-layout-template="Swift_Preferences.cshtml" data-preloader="inline"> 148 <input type="hidden" name="ID" value="@Pageview.ID" /> 149 <input type="hidden" name="CurrentPageID" value="@pageId" /> 150 <input type="hidden" name="GroupID" value="@groupId" /> 151 <input type="hidden" name="ProductID" value="@productId" /> 152 <input type="hidden" name="VariantID" value="@variantId" /> 153 154 <div class="form-floating"> 155 <select name="CurrencyCode" id="CurrencySelect" class="form-select d-col-12" aria-label="@Translate("Select currency")" onchange="swift.PageUpdater.Update(event)"> 156 @foreach (var currency in currencies) 157 { 158 string selectedCurrency = currency.Code == Dynamicweb.Ecommerce.Common.Context.Currency.Code ? "selected" : ""; 159 160 if (!string.IsNullOrEmpty(currency.Code)) { 161 <option value="@currency.Code" @selectedCurrency>@currency.Code</option> 162 } 163 } 164 </select> 165 <label for="CurrencySelect">@Translate("Currency")</label> 166 </div> 167 </form> 168 } 169 </div> 170 <div class="modal-footer"> 171 @{ 172 hostName = !string.IsNullOrEmpty(Pageview.Area.DomainLock) ? Pageview.Area.DomainLock : url.Host; 173 string link = $"Default.aspx?ID={updatePageId}"; 174 link += groupId != "" ? $"&GroupID={groupId}" : ""; 175 link += productId != "" ? $"&ProductID={productId}" : ""; 176 link += variantId != "" ? $"&VariantID={variantId}" : ""; 177 var friendlyUrl = $"{url.Scheme}://{hostName}{Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(link)}"; 178 } 179 180 <a href="@friendlyUrl" class="btn btn-primary w-100">@Translate("Update preferences")</a> 181 </div> 182 </div> 183 } 184 185 186 @* Dropdowns *@ 187 188 @if (layout == "dropdown" && type == "country") { 189 foreach (var country in ecomCountries) 190 { 191 var link = $"{url.Scheme}://{hostName}?ID={currentPage.ID}&AreaID={Pageview.Area.ID}&CountryCode={country.Code2}"; 192 link += groupId != "" ? $"&GroupID={groupId}" : ""; 193 link += productId != "" ? $"&ProductID={productId}" : ""; 194 link += variantId != "" ? $"&VariantID={variantId}" : ""; 195 196 if (!string.IsNullOrEmpty(country.Name)) { 197 <li> 198 <a href="@link" class="dropdown-item nav-link-underline @linkFontSize @linkFontWeight @linkCasing">@country.Name</a> 199 </li> 200 } 201 } 202 } 203 204 @if (layout == "dropdown" && type == "language") { 205 string iconFolder = "/Files/FlagIcons/"; 206 207 foreach (var language in languages) 208 { 209 if (language.Area != null) { 210 hostName = !string.IsNullOrEmpty(language.Area.DomainLock) ? language.Area.DomainLock : url.Host; 211 string link = $"Default.aspx?ID={language.ID}"; 212 link += groupId != "" ? $"&GroupID={groupId}" : ""; 213 link += productId != "" ? $"&ProductID={productId}" : ""; 214 link += variantId != "" ? $"&VariantID={variantId}" : ""; 215 216 var friendlyUrl = $"{url.Scheme}://{hostName}{Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(link)}"; 217 218 string icon = iconFolder + language.Area.CultureInfo.Name.ToLower() + ".svg"; 219 string name = reg.Replace(language.Area.CultureInfo.DisplayName, ""); 220 221 <li> 222 <a hreflang="@language.Area.CultureInfo.TwoLetterISOLanguageName" href="@friendlyUrl" class="dropdown-item nav-link-underline @linkFontSize @linkFontWeight @linkCasing">@RenderIcon(icon, "icon-2") <span class="align-middle">@name</span></a> 223 </li> 224 } 225 } 226 } 227 228 @if (layout == "dropdown" && type == "currency") { 229 foreach (var currency in currencies) 230 { 231 var link = $"{url.Scheme}://{hostName}?ID={currentPage.ID}&AreaID={Pageview.Area.ID}&CurrencyCode={currency.Code}"; 232 link += groupId != "" ? $"&GroupID={groupId}" : ""; 233 link += productId != "" ? $"&ProductID={productId}" : ""; 234 link += variantId != "" ? $"&VariantID={variantId}" : ""; 235 236 <li> 237 <a href="@link" class="dropdown-item nav-link-underline @linkFontSize @linkFontWeight @linkCasing">@currency.Code</a> 238 </li> 239 } 240 } 241 242 243 244 @helper RenderIcon(string icon, string iconSize) 245 { 246 if (Path.GetExtension(icon).ToLower() == ".svg" && !icon.ToLower().Contains("none")) 247 { 248 string iconPath = Dynamicweb.Context.Current.Server.MapPath(icon); 249 250 <span class="@iconSize"> 251 @ReadFile(iconPath) 252 </span> 253 } 254 } 255 256