MudBlazor:使用MudAutocomplete时遭遇异常结果求助
问题排查与修复方案
问题1:清空搜索框后,MudCard未显示初始内容列表
原因
当前仅在输入文本调用GetSearchSugestions时才会更新FilteredItems,清空搜索框时没有触发重置FilteredItems的逻辑,导致列表停留在最后一次筛选的结果。
修复方案
监听搜索文本的变化,当文本为空时将FilteredItems重置为初始的Items集合,通过给MudAutocomplete添加ValueChanged事件实现。
问题2:选择搜索建议后未展示精确内容
原因
当前筛选逻辑为模糊匹配,无论用户输入还是选择建议,都执行包含性搜索,无法针对选中的完整问题类建议返回精确结果。
修复方案
调整筛选逻辑:优先检查搜索文本是否与某个FAQ的Question完全匹配,若匹配则仅返回该FAQ;否则执行原有的模糊匹配逻辑。
修改后的完整代码
前端代码
<MudAutocomplete T="string" Placeholder="Search.." @bind-Value="SearchText" SearchFunc="@GetSearchSugestions" ResetValueOnEmptyText="true" CoerceText="true" CoerceValue="true" ValueChanged="@OnSearchTextChanged" AdornmentIcon="@Icons.Material.Filled.Search" AdornmentColor="Color.Primary" /> @foreach(var item in FilteredItems) { <MudCard> <MudCardContent> <MudText Typo="Typo.h6">@item.GroupName</MudText> <MudText Typo="Typo.subtitle2">@item.Question</MudText> <MudText Typo="Typo.body1">@item.Answer</MudText> </MudCardContent> </MudCard> <MudDivider /> }
后台代码
@code { public string SearchText { get; set; } = string.Empty; public List<string> Suggestions { get; set; } = new List<string>(); public List<Faq> Items { get; set; } = default!; public List<Faq> FilteredItems { get; set; } = default!; protected override void OnInitialized() { Items = new List<Faq>() { new Faq() { GroupName = "AI", Question = "How soon AI will change human labour?", Answer = "Very soon" }, new Faq() { GroupName = "AI", Question = "is ChatGP a threat to humanity?", Answer = "No, ChatGPT is there to help humanity" }, new Faq() { GroupName = "War", Question = "Is world war 3 inevitable?", Answer = "Yes" }, new Faq() { GroupName = "War", Question = "how did world war 2 started?", Answer = "Escalation in Europe" } }; FilteredItems = Items; } private async Task<IEnumerable<string>> GetSearchSugestions(string text) { await Task.Delay(2); var suggestions = new List<string>(); if(!string.IsNullOrEmpty(text)) { var filteredItems = FindFaqsBySearchText(text); foreach (var faq in filteredItems) { if (!suggestions.Contains(faq.Question)) { suggestions.Add(faq.Question); } var words = faq.Answer.Split().Select(a => a.Trim()); foreach (var word in words) { if (word.Contains(text.ToLower()) && !suggestions.Contains(word)) { suggestions.Add(word); } } } } return suggestions; } private List<Faq> FindFaqsBySearchText(string text) { var lowerText = text.ToLower(); // 优先匹配完整问题 var exactMatch = Items.FirstOrDefault(f => f.Question.ToLower() == lowerText); if (exactMatch != null) { return new List<Faq> { exactMatch }; } // 模糊匹配逻辑 return Items.Where(f => f.Question.ToLower().Contains(lowerText) || f.Answer.ToLower().Contains(lowerText) || f.GroupName.ToLower().Contains(lowerText)) .ToList(); } private void OnSearchTextChanged(string value) { SearchText = value; if (string.IsNullOrEmpty(value)) { FilteredItems = Items; } else { FilteredItems = FindFaqsBySearchText(value); } } public class Faq { public string GroupName { get; set; } = string.Empty; public string Question { get; set; } = string.Empty; public string Answer { get; set; } = string.Empty; } }
内容的提问来源于stack exchange,提问作者Riley Christian
相关产品推荐
相关产品推荐

