You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 02:21:00