【发布时间】:2021-12-18 00:55:47
【问题描述】:
我正在使用带有 MudBlazor 的 Blazor,并且我在编辑页面上有以下表单:
<EditForm Model="BookRequestVM" OnInvalidSubmit="InvalidBookRequest" OnValidSubmit="@ValidBookRequest">
...
<MudItem xs="12" sm="4">
<MudSelect T="BookType" Label="Book Type" @bind-Value="@BookRequestVM.BookType" @bind-SelectedValues="hashBookTypes" Required="true">
@foreach (var selectItem in BookTypes)
{
<MudSelectItem Value="@selectItem">@selectItem.TypeTitle</MudSelectItem>
}
</MudSelect>
</MudItem>
</EditForm>
...
@code {
public class BookType
{
public int BookTypeId { get; set; }
public string TypeTitle { get; set; }
}
public HashSet<BookType> hashBookTypes = new HashSet<BookType>();
...
protected override async Task OnInitializedAsync()
{
BookRequestVM = await _bookService.GetBookRequest(Id); // Fetch info from database
BookTypes = _bookService.GetBookTypes().ToList(); // Get all valid dropdown values
hashBookTypes = new HashSet<BookType>(BookTypes);
}
}
因为我正在提取现有数据(创建图书请求时需要此图书类型字段),所以总会有一个图书类型与此图书请求相关联。我看到 BookTypeVM 能够在服务调用中从数据库中提取 Book Type,并且在有效的提交方法上,它被绑定并正确保存。只是在加载时,它不会默认为保存到数据库中的值——只有下拉列表中的第一个值。关于这里发生了什么的任何想法?
【问题讨论】:
-
这是多选吗?如果不是,那你为什么要设置
@bind-SelectedValues="hashBookTypes"。hashBookTypes来自BookTypes,这是所有书籍类型的列表。我不是 MudBlazor 方面的专家,但您似乎将所选值设置为完整的值列表。如果没有`MultiSelection="true"`,那么我猜它会将当前值设置为列表中的第一个值。 -
你需要在
OnInitializedAsnyc方法中设置值后调用StateHasChanged()来指示DOM已经更新。 -
@MrCakaShaunCurtis 这确实是问题的原因。在我仔细查看代码之前,我根本不记得在我的末尾添加了该绑定属性,但删除它显示了正确的行为。
-
太好了,我添加了我的评论作为答案供您打勾。
标签: drop-down-menu blazor mudblazor