Error executing template "Designs/Swift/eCom/ProductCatalog/ProductSearchDropdownResponse.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
   at CompiledRazorTemplates.Dynamic.RazorEngine_3ae36488d3514e439a687b0780790fdb.Execute() in E:\Dynamicweb.NET\Solutions\swift.blomberg.espresso4.dk\Files\Templates\Designs\Swift\eCom\ProductCatalog\ProductSearchDropdownResponse.cshtml:line 190
   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 ViewModelTemplate<ProductListViewModel> 2 @using Dynamicweb.Rendering 3 @using Dynamicweb.Ecommerce.ProductCatalog 4 5 @{ 6 string searchTerm = string.Empty; 7 string layout = Dynamicweb.Context.Current.Request["SearchLayout"] != null ? Dynamicweb.Context.Current.Request["SearchLayout"].ToString() : "field"; 8 string itemPadding = layout == "icon" ? "px-1" : "px-1"; 9 string iconPath = "/Files/Templates/Designs/Swift/Assets/icons/"; 10 11 if (!string.IsNullOrEmpty(Dynamicweb.Context.Current.Request["eq"])) 12 { 13 searchTerm = System.Net.WebUtility.HtmlEncode(Dynamicweb.Context.Current.Request["eq"].Trim()); 14 } 15 Dictionary<string, string> suggestions = new Dictionary<string, string>(); 16 17 } 18 19 @functions{ 20 string Highlight(string input, string textToHighlight) 21 { 22 if (string.IsNullOrEmpty(textToHighlight)) 23 { 24 return input; 25 } 26 input = fixHtmlEncoding(input.ToLower()); 27 foreach (string term in textToHighlight.Split(new[] { ' ' }, System.StringSplitOptions.RemoveEmptyEntries)) 28 { 29 input = input.Replace(term, "</mark>" + term + "<mark>"); 30 } 31 32 return "<span class=\"js-suggestion flex-fill text-break\" data-suggestion-value=\"\"><mark>" + input + "</mark></span>"; 33 } 34 35 string ProductNameHighlight(string input, string textToHighlight) 36 { 37 if (string.IsNullOrEmpty(textToHighlight)) 38 { 39 return input; 40 } 41 input = fixHtmlEncoding(input.ToLower()); 42 foreach (string term in textToHighlight.Split(new[] { ' ' }, System.StringSplitOptions.RemoveEmptyEntries)) 43 { 44 input = input.Replace(term, "<mark>" + term + "</mark>"); 45 } 46 47 return "<span class=\"js-suggestion flex-fill text-break\" data-suggestion-value=\"\">" + input + "</span>"; 48 } 49 50 string fixHtmlEncoding(string input) 51 { 52 if (input.IndexOf("&") > 0) 53 { 54 if (input.IndexOf(" ", input.IndexOf("&")) > 0) 55 { 56 input = input.Replace(" ", "; "); 57 } 58 else 59 { 60 input += ";"; 61 input = System.Net.WebUtility.HtmlDecode(input); 62 } 63 } 64 return input; 65 } 66 67 string escape(string input) 68 { 69 return Dynamicweb.Core.Encoders.HtmlEncoder.JavaScriptStringEncode(fixHtmlEncoding(input)); 70 } 71 72 void AddSuggestion(string suggestion, string group, Dictionary<string, string> suggestions) 73 { 74 suggestion = suggestion.ToLower(); 75 if (!suggestions.ContainsKey(suggestion)) 76 { 77 suggestions.Add(suggestion, group); 78 } 79 } 80 } 81 82 @if (Model.SpellCheckerSuggestions != null && Model.SpellCheckerSuggestions.Any()) 83 { 84 List<string> validSuggestions = new List<string>(); 85 foreach (string suggestion in Model.SpellCheckerSuggestions) 86 { 87 if (!validSuggestions.Contains(suggestion)) 88 { 89 validSuggestions.Add(suggestion); 90 } 91 } 92 if (validSuggestions.Count == 0) 93 { 94 foreach (string suggestion in Model.SpellCheckerSuggestions) 95 { 96 if (!validSuggestions.Contains(suggestion)) 97 { 98 validSuggestions.Add(suggestion); 99 } 100 } 101 } 102 if (validSuggestions.Count > 0) 103 { 104 foreach (string suggestion in validSuggestions.Take(5)) 105 { 106 AddSuggestion(suggestion, "Did you mean", suggestions); 107 <li class="dropdown-item d-flex flex-row align-items-center py-2 px-0 text-wrap"> 108 109 <span class="dropdown-item-search-icon d-flex align-items-center justify-content-center" aria-hidden="true" onclick="swift.Typeahead.selectSuggestion(this.parentElement);"></span> 110 111 <span class="flex-fill" onclick="swift.Typeahead.selectSuggestion(this.parentElement);">@Highlight(suggestion, searchTerm)</span> 112 113 <span class="dropdown-item-arrow-icon d-flex d-lg-none align-items-center justify-content-center" aria-hidden="true" onclick="swift.Typeahead.setSuggestion(this.parentElement);"></span> 114 115 </li> 116 } 117 } 118 } 119 120 @if (Model.FacetGroups.Any()) 121 { 122 var maxSuggestions = 5; 123 foreach (var facetGroup in Model.FacetGroups) 124 { 125 foreach (var facetItem in facetGroup.Facets) 126 { 127 var facetOptionCount = facetItem.OptionCount; 128 var optionActiveCount = facetItem.OptionActiveCount; 129 var facetOptionResultTotalCount = facetItem.OptionResultTotalCount; 130 var queryParameter = facetItem.QueryParameter; 131 var template = facetItem.RenderType; 132 133 var maxValue = facetItem.MaximumFacetValue; 134 var minValue = facetItem.MinimumFacetValue; 135 136 List<FacetOptionViewModel> validOptions = new List<FacetOptionViewModel>(); 137 138 foreach (var facetOption in facetItem.Options.OrderByDescending(option => option.Count)) 139 { 140 if (searchTerm != null && validOptions.Count < maxSuggestions) 141 { 142 validOptions.Add(facetOption); 143 } 144 } 145 146 if (validOptions.Count > 0) 147 { 148 <li class="text-wrap"> 149 <h6 class="dropdown-header ps-5 pe-3 py-3">@facetItem.Name</h6> 150 </li> 151 foreach (var facetOption in validOptions) 152 { 153 AddSuggestion(facetOption.Label, facetItem.Name, suggestions); 154 <li class="dropdown-item @itemPadding" onclick="swift.Typeahead.selectSuggestion(this);" data-param="@queryParameter" data-paramvalue="@facetOption.Value"> 155 @Highlight(facetOption.Label, searchTerm) 156 <div class="">@facetOption.Count</div> 157 </li> 158 } 159 } 160 161 } 162 } 163 } 164 165 @if (Model.Products.Count() > 0) 166 { 167 var validSuggestions = new List<ProductViewModel>(); 168 string label = Translate("Products"); 169 if (Model.Group != null) 170 { 171 label = Model.Group.Name; 172 } 173 174 foreach (var product in Model.Products) 175 { 176 if (searchTerm != null && product.Name.IndexOf(searchTerm, StringComparison.InvariantCultureIgnoreCase) >= 0 || true) 177 { 178 AddSuggestion(product.Name, label, suggestions); 179 validSuggestions.Add(product); 180 } 181 } 182 if (validSuggestions.Count > 0) 183 { 184 <li class="text-wrap"> 185 <h6 class="dropdown-header ps-5 pe-3 py-3">@label</h6> 186 </li> 187 foreach (var suggestion in validSuggestions) 188 { 189 var defaultGroupId = suggestion.PrimaryOrDefaultGroup.Id; 190 var selectedDetailsPage = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(defaultGroupId).Meta.PrimaryPage; 191 selectedDetailsPage = !string.IsNullOrEmpty(selectedDetailsPage) ? "data-selected-details-page=\"" + Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(selectedDetailsPage) + "\"" : ""; 192 193 <li class="dropdown-item d-flex flex-row flex-lg-row-reverse align-items-center text-wrap px-0 text-wrap" onclick="swift.Typeahead.selectSuggestion(this);" data-param="ProductId" @selectedDetailsPage data-paramvalue="@suggestion.Id"> 194 195 <span aria-hidden="true" class="d-lg-none dropdown-item-search-icon d-flex align-items-center justify-content-center"></span> 196 @ProductNameHighlight(suggestion.Name + " - <small class=\"fs-8\">" + suggestion.Number + "</small>", searchTerm) 197 <img class="mx-2" src="/admin/public/getimage.ashx?image=@Dynamicweb.Context.Current.Server.UrlEncode(suggestion.DefaultImage.Value)&width=32&height=32&format=webp&Crop=5&fillcanvas=true" height="32" width="32" alt="@suggestion.Name"> 198 </li> 199 } 200 } 201 } 202 203 @if (!string.IsNullOrEmpty(searchTerm)) 204 { 205 if (Model.TotalProductsCount > 0) 206 { 207 <li class="dropdown-item text-center text-decoration-underline text-wrap @itemPadding" onclick="swift.Typeahead.selectSuggestion(this);"> 208 @Translate("View all") @Model.TotalProductsCount @Translate("products for")<mark> "<span class="js-suggestion">@searchTerm</span>"</mark> 209 </li> 210 } 211 else 212 { 213 <li class="dropdown-item text-center text-decoration-underline text-wrap @itemPadding" onclick="swift.Typeahead.selectSuggestion(this);" style="cursor: pointer;"> 214 @Translate("We have no results for")<mark> "<span class="js-suggestion">@searchTerm</span>"</mark> 215 </li> 216 } 217 <li class="py-2"></li> 218 } 219