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