MudBlazor MudAutocomplete - 如何在列表中显示“名称”,但绑定 ID?

Den*_*isR 6 mudblazor

我的模型看起来像这样

public partial class EditModel
{
    public int Id { get; set; }
...

    public string Item { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的 SearchItems 方法标头如下所示

protected async Task<IEnumerable<ListItem>> SearchItems(string value)
Run Code Online (Sandbox Code Playgroud)

返回这些的“列表”

public partial class ListItem
{
    public string Id { get; set; }
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

如何让 MudAutocomplete 显示名称,同时返回/绑定 ID?

<MudAutocomplete T="ListItem" Label="Select item" @bind-Value="EditModel.Item"
    Clearable="true"
    MinCharacters="4" SearchFunc="@SearchItems"
    ToStringFunc="@(i => i==null ? null : $"{i.Id} [{i.Name}]")"
    SelectValueOnTab="true"/>  
Run Code Online (Sandbox Code Playgroud)

在 @bind-Value 上,Visual studio 显示此错误

...无法从“字符串”转换为“EditModel.Item”

Den*_*isR 8

这就是我现在解决它的方法...

我的 SearchItems 方法现在只返回字符串列表

protected async Task<IEnumerable<string>> SearchItems(string value)
Run Code Online (Sandbox Code Playgroud)

我已将此属性放入 MudAutocomplete 中

ToStringFunc="@(i => ItemDisplay(i))" 
Run Code Online (Sandbox Code Playgroud)

这是我的 ItemDisplay 方法

private string ItemDisplay(string itemId)
{
    var item = ListItems.FirstOrDefault(i => i.Id == itemId);

    return item == null ? "!Not Found!" : $"{item.Id} [{item.Name}]";
}
Run Code Online (Sandbox Code Playgroud)

我必须将其添加到我的 ComponentBase 中,以“缓存”所有 ListItems 以供在 ItemDisplay() 方法中使用:

public List<ListItem> ListItems { get; set; } = new();
Run Code Online (Sandbox Code Playgroud)

OnInitializedAsync()中

ListItems = await MyService.GetItemsAsync();
Run Code Online (Sandbox Code Playgroud)

我已将 GetItemsAsync() 设置为使用 IMemoryCache (Microsoft.Extensions.Caching.Memory),但我仍然不喜欢这种方法。我很难相信这个组件不支持该功能。


小智 6

也许该组件已更新,但我能够通过使用以下我认为很好的方法来实现这一目标。

您要使用的型号

record State(Guid Id, string Name);
Run Code Online (Sandbox Code Playgroud)

绑定值

private State value1;
Run Code Online (Sandbox Code Playgroud)

搜索功能返回IEnumerable<State>

private async Task<IEnumerable<State>> Filter(string value)
{
    // Filtering logic
}
Run Code Online (Sandbox Code Playgroud)

最后,我用来ToStringFunc定义值在下拉列表中的显示方式

<MudAutocomplete T="State" ToStringFunc="@(state => state.Name)" Label="US States" @bind-Value="value1" SearchFunc="@Filter" Variant="Variant.Outlined"/>
Run Code Online (Sandbox Code Playgroud)