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

Blazor获取列唯一值并关联另一列用于下拉选择框

Blazor中从重复数据提取唯一值构建下拉框的解决方案

核心问题修复步骤

1. 让UI能访问result变量

你在OnInitializedAsync里定义的result是局部变量,Blazor的UI模板只能读取组件类的成员字段/属性。解决方法是把result声明为组件的成员变量,类型用元组数组即可。

2. 修正Console.WriteLine的语法错误

你写的Console.WriteLine(item => $"name: {item.name}, desc: {item.kind}")是错误用法:Console.WriteLine不需要lambda表达式,直接传字符串插值即可;另外元组里的字段是desc不是kind,要对应正确。

3. 修复JSON数据源格式

你的JSON里字符串值没加双引号,属于无效JSON,必须修正为标准格式才能被GetFromJsonAsync正确解析。


修正后的完整代码

@page "/"
@inject HttpClient httpClient
@inject IJSRuntime JSRuntime

@if (result != null)
{     
    <select required @bind="selectedName">
        <option value="" disabled selected hidden>Search by Description</option>
        @foreach (var r in result)
        {
            <option value="@r.name">@r.desc</option>
        }
    </select>
    <!-- 可选:显示选中的结果 -->
    <p>已选名称:@selectedName</p>
}

@code{
    // 声明为组件成员变量,让UI可以访问
    private (string name, string desc)[] result;
    private Item[] data;
    private string selectedName; // 存储下拉框选中的值

    public class Item
    {
        public string name { get; set; }
        public string desc { get; set; }             
        public int point { get; set; }
    }  

    protected override async Task OnInitializedAsync()
    {
        data = await httpClient.GetFromJsonAsync<Item[]>("sample-data/dataFile.json"); 
        await JSRuntime.InvokeVoidAsync("console.log", "data ", data);
  
        // 分组逻辑保持不变,赋值给成员变量result
        result = data
            .GroupBy(item => item.name, item => item.desc)
            .Select(group => (name: group.Key, desc: group.First()))
            .ToArray();
            
        await JSRuntime.InvokeVoidAsync("console.log", "result", result);

        // 修正后的Console.WriteLine写法
        foreach (var item in result)
        {
            Console.WriteLine($"name: {item.name}, desc: {item.desc}");
        }     
    } 
}

修正后的JSON数据源(sample-data/dataFile.json)

[
    {"name": "A", "desc": "fragile", "point":70},
    {"name": "A", "desc": "sturdy", "point":80},
    {"name": "C", "desc": "hard", "point":100},
    {"name": "C", "desc": "soft", "point":150}
]

额外说明

  • 下拉框绑定的selectedName是用来存储选中值的变量,原代码里的bind="desc"是错误的,因为desc不是组件的成员字段。
  • 分组逻辑GroupBy(item => item.name, item => item.desc)会按name去重,然后取每组的第一个desc,完全符合你期望的结果集格式。

内容的提问来源于stack exchange,提问作者Tar270

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 04:36:13