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_e0e4469914144e20a352a81d932bf1ca.Execute() in D:\dynamicweb.net\Solutions\twodayco3\evasolo.cloud.dynamicweb-cms.com\Files\Templates\Designs\Swift\_parsed\Swift_Preferences.parsed.cshtml:line 210
   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 <div data-intersect></div> 3 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel> 4 @using System 5 @using System.Text.RegularExpressions 6 @using System.IO 7 8 9 10 @{ 11 string layout = Model.Item.GetRawValueString("PreferencesLayout", "modal"); 12 layout = Dynamicweb.Context.Current.Request["Layout"] != null ? Dynamicweb.Context.Current.Request["Layout"] : layout; 13 layout = layout == "" ? "modal" : layout; 14 string type = Dynamicweb.Context.Current.Request["Type"] != null ? Dynamicweb.Context.Current.Request["Type"] : "language"; 15 16 string groupId = Dynamicweb.Context.Current.Request["GroupID"] != null ? Dynamicweb.Context.Current.Request["GroupID"].ToString() : ""; 17 string productId = Dynamicweb.Context.Current.Request["ProductID"] != null ? Dynamicweb.Context.Current.Request["ProductID"].ToString() : ""; 18 string variantId = Dynamicweb.Context.Current.Request["VariantID"] != null ? Dynamicweb.Context.Current.Request["VariantID"].ToString() : ""; 19 20 string linkFontSize = Dynamicweb.Context.Current.Request["FontSize"] != null ? Dynamicweb.Context.Current.Request["FontSize"].ToString() : ""; 21 string linkFontWeight = Dynamicweb.Context.Current.Request["FontWeight"] != null ? Dynamicweb.Context.Current.Request["FontWeight"].ToString() : ""; 22 string linkCasing = Dynamicweb.Context.Current.Request["Casing"] != null ? Dynamicweb.Context.Current.Request["Casing"].ToString() : ""; 23 24 Regex reg = new Regex(@"\(([^\)]+)\)"); 25 List<Dynamicweb.Content.Page> languages = new List<Dynamicweb.Content.Page>(); 26 27 int pageId = Dynamicweb.Context.Current.Request["CurrentPageID"] != null ? Convert.ToInt32(Dynamicweb.Context.Current.Request["CurrentPageID"]) : Pageview.ID; 28 var currentPage = Dynamicweb.Content.Services.Pages.GetPage(pageId); //Get the correct page instance 29 30 if (currentPage.Area.IsMaster) { 31 languages.Add(currentPage); 32 if (currentPage.Languages != null) { 33 foreach (var language in currentPage.Languages) { 34 if (language.Area.Active == true) { 35 languages.Add(language); 36 } 37 } 38 } 39 } else { 40 languages.Add(currentPage.MasterPage); 41 if (currentPage.MasterPage != null) { 42 if (currentPage.MasterPage.Languages != null) { 43 foreach (var language in currentPage.MasterPage.Languages) { 44 if (language.Area.Active == true) { 45 languages.Add(language); 46 } 47 } 48 } 49 } 50 } 51 52 languages = languages.Count > 1 ? languages.OrderBy(language => language.Area.CultureInfo.DisplayName).ToList() : languages; 53 54 string siteLanguage = Pageview.Area.CultureInfo.Name; 55 Uri url = Dynamicweb.Context.Current.Request.Url; 56 string hostName = url.Host; // domain.com/da-dk or domain.com/en-us 57 58 var ecomCountries = Dynamicweb.Ecommerce.Services.Countries.GetCountries() != null ? Dynamicweb.Ecommerce.Services.Countries.GetCountries().OrderBy(country => country.Name) : null; 59 var currencies = Dynamicweb.Ecommerce.Services.Currencies.GetAllCurrencies() != null ? Dynamicweb.Ecommerce.Services.Currencies.GetAllCurrencies().OrderBy(currency => currency.Code) : null; 60 61 string modalTheme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("ModalTheme")) ? " theme " + Model.Item.GetRawValueString("ModalTheme").Replace(" ", "").Trim().ToLower() : ""; 62 } 63 64 @* Modal *@ 65 66 @if (layout == "modal") 67 { 68 int updatePageId = pageId; 69 70 <div class="modal-content @modalTheme item_@Model.Item.SystemName.ToLower()"> 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 if (language != null && language.Published && language.Area.Active && language.Area.Published) { 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.Content.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>@language.Area.DisplayName</option> 113 } 114 } 115 </select> 116 <label for="LanguageSelect">@Translate("Language")</label> 117 </div> 118 </form> 119 } 120 121 @if (ecomCountries.Count() > 1 && Model.Item.GetBoolean("CountrySelector")) 122 { 123 <form action="/Default.aspx" data-response-target-element="PreferencesModalContent" data-layout-template="Swift_Preferences.cshtml" data-preloader="inline"> 124 <input type="hidden" name="ID" value="@Pageview.ID"> 125 <input type="hidden" name="CurrentPageID" value="@pageId"> 126 <input type="hidden" name="GroupID" value="@groupId"> 127 <input type="hidden" name="ProductID" value="@productId"> 128 <input type="hidden" name="VariantID" value="@variantId"> 129 130 <div class="form-floating"> 131 <select name="CountryCode" id="CountryCodeSelect" class="form-select d-col-12" aria-label="@Translate("Select country")" onchange="swift.PageUpdater.Update(event)"> 132 @foreach (var country in ecomCountries) 133 { 134 var selectedCountry = country.Code2 == Dynamicweb.Ecommerce.Common.Context.Country.Code2 ? "selected" : ""; 135 136 if (!string.IsNullOrEmpty(country.Name)) { 137 <option value="@country.Code2" @selectedCountry>@country.Name</option> 138 } 139 } 140 </select> 141 <label for="CountryCodeSelect">@Translate("Delivery country")</label> 142 </div> 143 </form> 144 } 145 146 @if (currencies.Count() > 1 && Model.Item.GetBoolean("CurrencySelector")) 147 { 148 <form action="/Default.aspx" data-response-target-element="PreferencesModalContent" data-layout-template="Swift_Preferences.cshtml" data-preloader="inline"> 149 <input type="hidden" name="ID" value="@Pageview.ID"> 150 <input type="hidden" name="CurrentPageID" value="@pageId"> 151 <input type="hidden" name="GroupID" value="@groupId"> 152 <input type="hidden" name="ProductID" value="@productId"> 153 <input type="hidden" name="VariantID" value="@variantId"> 154 155 <div class="form-floating"> 156 <select name="CurrencyCode" id="CurrencySelect" class="form-select d-col-12" aria-label="@Translate("Select currency")" onchange="swift.PageUpdater.Update(event)"> 157 @foreach (var currency in currencies) 158 { 159 string selectedCurrency = currency.Code == Dynamicweb.Ecommerce.Common.Context.Currency.Code ? "selected" : ""; 160 161 if (!string.IsNullOrEmpty(currency.Code)) { 162 <option value="@currency.Code" @selectedCurrency>@currency.Code</option> 163 } 164 } 165 </select> 166 <label for="CurrencySelect">@Translate("Currency")</label> 167 </div> 168 </form> 169 } 170 </div> 171 <div class="modal-footer"> 172 @{ 173 hostName = !string.IsNullOrEmpty(Pageview.Area.DomainLock) ? Pageview.Area.DomainLock : url.Host; 174 string link = $"Default.aspx?ID={updatePageId}"; 175 link += groupId != "" ? $"&GroupID={groupId}" : ""; 176 link += productId != "" ? $"&ProductID={productId}" : ""; 177 link += variantId != "" ? $"&VariantID={variantId}" : ""; 178 var friendlyUrl = $"{url.Scheme}://{hostName}{Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(link)}"; 179 } 180 181 <a href="@friendlyUrl" class="btn btn-primary w-100">@Translate("Update preferences")</a> 182 </div> 183 </div> 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 int languagesCount = 0; 207 208 foreach (var language in languages) 209 { 210 if (language.Area != null) { 211 if (language != null && language.Published && language.Area.Active && language.Area.Published && language.Area.ID != Dynamicweb.Frontend.PageView.Current().AreaID) { 212 hostName = !string.IsNullOrEmpty(language.Area.DomainLock) ? language.Area.DomainLock : url.Host; 213 string link = $"Default.aspx?ID={language.ID}"; 214 link += groupId != "" ? $"&GroupID={groupId}" : ""; 215 link += productId != "" ? $"&ProductID={productId}" : ""; 216 link += variantId != "" ? $"&VariantID={variantId}" : ""; 217 218 var friendlyUrl = $"{url.Scheme}://{hostName}{Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(link)}"; 219 220 string icon = iconFolder + language.Area.CultureInfo.Name.ToLower() + ".svg"; 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">@language.Area.DisplayName</span></a> 223 </li> 224 225 languagesCount++; 226 } 227 } 228 } 229 230 if (languagesCount == 0) { 231 <li> 232 <span class="dropdown-item fs-7 fw-normal"> 233 @Translate("Page is not translated") 234 </span> 235 </li> 236 } 237 } 238 239 @if (layout == "dropdown" && type == "currency") { 240 foreach (var currency in currencies) 241 { 242 var link = $"{url.Scheme}://{hostName}?ID={currentPage.ID}&AreaID={Pageview.Area.ID}&CurrencyCode={currency.Code}"; 243 link += groupId != "" ? $"&GroupID={groupId}" : ""; 244 link += productId != "" ? $"&ProductID={productId}" : ""; 245 link += variantId != "" ? $"&VariantID={variantId}" : ""; 246 247 <li> 248 <a href="@link" class="dropdown-item nav-link-underline @linkFontSize @linkFontWeight @linkCasing">@currency.Code</a> 249 </li> 250 } 251 } 252 253 @helper RenderIcon(string icon, string iconSize) 254 { 255 if (Path.GetExtension(icon).ToLower() == ".svg" && !icon.ToLower().Contains("none")) 256 { 257 string iconPath = Dynamicweb.Context.Current.Server.MapPath(icon); 258 259 <span class="@iconSize"> 260 @ReadFile(iconPath) 261 </span> 262 } 263 } 264 265