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