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