【问题标题】:Blazor - Dropdown issues selecting elementsBlazor - 选择元素的下拉问题
【发布时间】:2022-01-22 23:54:48
【问题描述】:

我有输入选择组件,它正在获取站点列表,它可以很好地填充下拉列表,但是当我选择一个元素时,列表本身会发生变化。

我怎样才能防止这种情况(我做错了什么)?

问题说明:

  1. Dropdown 加载非常好,第一个元素选择了“Site A”
  2. 点击下拉菜单(尚未选择任何内容)会显示站点 A、站点 B、站点 C 和站点 D
  3. 现在选择站点 B 会使我的下拉列表显示:站点 B、站点 B、站点 C 和站点 D

站点 A 去哪儿了?

选择站点 C 显示: 站点 C、站点 B、站点 C 和站点 D

所以看起来它绑定到列表中的第一个元素,我该如何阻止它,我只想从列表中读取它?

选择站点 C 时站点列表的控制台输出:

Site C
Site B
Site C
Site D
<EditForm Model=Sites>
<InputSelect ValueExpression=@(()=>SelectedSite.Site)
Value=@SelectedSite.Site
ValueChanged=@((string value) => OnSiteValueChanged(value))>
    @foreach (var site in Sites)
    {
    <option  value=@site.Site>@site.Site</option>
    }
</InputSelect>

我正在尝试将选择绑定到另一个名为 SelectedSite 的属性。 除列表内容外,一切正常。

其他信息:

private void OnSiteValueChanged(string value)
        {
            SelectedSite.Site = value;
            foreach(var item in Sites)
            {
                Console.WriteLine(item.Site);
            }
        }

【问题讨论】:

    标签: binding blazor dropdown


    【解决方案1】:

    这应该可以解决问题:

    private void OnSiteValueChanged(string value)
    {
        //this selects new site by value
        SelectedSite = Sites.FirstOrDefault(s => s.Site == value);
    }
    

    解释:

    在您最初的 OnSiteValueChanged() 方法中,您没有选择新站点,而是将现有站点从“站点 A”更改为“站点 B”,分别更改为“站点 C”。

    【讨论】:

    • 是的,先生,这确实解决了问题。完美!
    • 这是一个糟糕的解决方法,它求助于 LINQ 来设置“模型”变量。相反,您应该指出整个代码的根本错误,如何使用以及何时使用 EditForm 组件等。
    • 我不认为这是根本错误的。鉴于 InputSelect 不支持将选定值绑定到复杂类型,这是自然的选择。随意投反对票并提供更好的答案。
    • 所以你认为提供给EditForm组件的模型可以是一个字符串列表(Sites)。它是使用的实际模型对象,还是它的存在仅仅是为了防止编译器错误;毕竟,它没有任何其他用途。据我所知,模型应该是单个对象,通常是应用于它的双向数据绑定。这里的“模型”实际上是 EditForm 组件外部的变量。正如我所说,这是一种糟糕的解决方法,而且成本很高,因为它使用 LINQ 来设置“模型”变量。
    【解决方案2】:

    每当您使用循环来呈现 Blazor 内容(您的 @foreach )时,您应该在呈现的元素上使用 @key 指令,以便 Blazor 可以跟踪它需要添加/删除或更新的元素。

    @foreach (var site in Sites)
    {
     <option @key=site.Site value=@site.Site>@site.Site</option>
    }
    

    在这种情况下,我会使用site.Site 作为@key,因为它似乎是一个唯一的字符串,但您可以只使用site 作为@key。

    【讨论】:

    • 我现在确实记得一些关于@key 的事情。如果我使用 site.Site 它确实有效,但它给了我一个错误,此外,列表仍然在物理上发生了变化。 (我将在下一条评论中发布错误)。请注意,这些网站都是独一无二的,我尝试过只使用不起作用的网站。我是对 OnSiteValueChanged 做错了什么,还是它的绑定导致了一些问题(我将在原始问题中发布代码。
    • blazor.webassembly.js:1 crit: Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100] 未处理的异常渲染组件:元素“option”的多个同级具有相同的键值, '站点 B'。键值必须是唯一的。 System.InvalidOperationException:元素“选项”的多个同级具有相同的键值“站点 B”。键值必须是唯一的。
    • Sites 来自哪里?它是如何填充的?它不应该有重复?
    • 它来自API,它来自数据库,每个“Site”作为名称,每个ID作为主键都是唯一的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 2011-05-07
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 2015-10-13
    相关资源
    最近更新 更多