asp.net 用于绑定到int集合中特定值的LINQ查询

jjhzyzn0  于 2022-11-19  发布在  .NET
关注(0)|答案(1)|浏览(108)

我 正在 尝试 使用 foreach 语句 在 Blazor 表单 组件 中 动态 构建 下拉 列表 。 该 表单 用于 产品 , 产品 可以 链接 到 标签 。 标签 本身 具有 标签 类型 , 我 希望 为 每个 标签 类型 动态 生成 一 个 单独 的 下拉 列表 , 下拉 列表 将 链接 到 该 类型 的 所有 标签 , 并且 仅 绑定 到 该 标签 类型 的 标签 。

@foreach (var type in tagTypesDto)
{
    <div class="form-group mb-3">
        <RadzenSelect AllowClear="true" AllowFiltering="true" @bind-Value=@productDto.SelectedProductTags.Where(x => x == type.Tags.Select(x => x.Id).FirstOrDefault()) Multiple="true" Placeholder="@_localizer["PleaseSelect"]" Data=@tagsDto.Where(x => x.TagTypeId == type.Id)
            TextProperty="Name" ValueProperty="Id" Label="@_localizer["ProductAttributes"]" />
    </div>
}

中 的 每 一 个
我 无法 建置 这个 , 因为 我 收到 下列 错误 :
赋值 的 左侧 必须 是 变量 、 属性 或 索引 器
我 认为 问题 出 在 我 试图 传递 给 它 的 @bind-Value 的 LINQ 查询 上 - - 如果 我 只用 @productDto.SelectedProductTags 替换 它 , 那么 它 会 为 每 种 标记 类型 构建 并 生成 一 个 单独 的 下拉 列表 , 但是 如果 我 尝试 选择 任何 标记 , 它 就会 失败 , 大概 是 因为 它 不 知道 将 标记 分配 给 哪个 下拉 列表 。
SelectedProductTags 在 我 的 产品 模型 中 如下 所 示 :

public virtual IEnumerable<int>? SelectedProductTags { get; set; } = new int[] { };

格式
我 使用 的 是 . NET 6 和 Blazor Webassembly 。

fsi0uk1n

fsi0uk1n1#

我在GitHub上创建了一个演示项目,为您的问题提供了一个可能的解决方案:https://github.com/Jimmys20/SO74219635
您必须使用手动事件绑定:

@foreach (var type in tagTypesDto)
{
    <div class="form-group mb-3">
        var tagTypeId = type.Id;
    
        <RadzenDropDown Data="tagsDto.Where(x => x.TagTypeId == type.Id).ToList()"
                        Value="productDto.SelectedProductTags"
                        ValueChanged="values => OnValueChanged(values, tagTypeId)"
                        TValue="List<int>"
                        Multiple="true"
                        ValueProperty="Id"
                        TextProperty="Name" />
    </div>
}

@code {
    private void OnValueChanged(List<int> values, int tagTypeId)
    {
        var data = tagsDto.Where(t => t.TagTypeId == tagTypeId).Select(t => t.Id);
        
        productDto.SelectedProductTags.RemoveAll(x => data.Contains(x));
        
        productDto.SelectedProductTags = productDto.SelectedProductTags.Concat(values).ToList();
    }
}

需要将SelectedProductTags更改为List<int>

相关问题