【发布时间】:2021-09-05 06:33:26
【问题描述】:
我有一个 Blazor 组件,它以无序列表的形式显示来自 SQL 的数据。
LoadData 方法由 OnInitialized() 事件调用并填充 List<T>(在本例中为 ProjectModel 列表)。数据量很大,所以我只从 SQL 中获取前 100 行(作为预览)。
我使用 foreach 遍历该列表并为每个元素创建一个 <li>。
这很好用。
但是,该页面还包含一个搜索框。一旦用户输入搜索字符串并单击搜索按钮,就会调用另一种方法再次从 SQL 获取数据,这次是根据用户提供的搜索词进行过滤。过滤是在 SQL 查询中完成的。查询结果再次用于填充 ProjectModels 列表(它会覆盖列表的第一个实例)。
我可以在一毫秒内看到新的过滤列表,然后会弹出初始数据。我猜这是因为再次触发了 OnInitialized,其中包含使用初始数据填充列表的查询。
这是我的组件的样子:
@page "/projects"
<form>
<input type="search" placeholder="enter search term..." @bind-value="searchTerm">
<button type="submit" @onclick="GetSearchResults">Search</button>
</form>
<ul>
@foreach (var project in projects)
{
<li>@project.ProjectId</li>
<li>@project.ProjectTitle</li>
}
</ul>
@code {
private string searchTerm;
private List<ProjectModel> projects = new List<ProjectModel>();
protected override void OnInitialized()
{
projects = GetProjects(); //the method that loads the inital data
}
private void GetSearchResults()
{
projects = GetProjectsBySearchTerm(searchTerm);
}
}
我怎样才能正确地做到这一点?即
- 获取页面加载时的初始预览数据并将其放入
<ul> - 将
<ul>中的数据替换为根据提供的搜索词查询到的数据,同时避免一旦数据发生变化就触发初始加载。
这里是 C# 和 Blazor 新手,所以请放轻松,如果我需要提供更多详细信息,请告诉我。 谢谢大家。
【问题讨论】:
-
所有答案都为您指明了正确的方向。但是: 1. 你为什么不“分页”你的数据,这样你一次只显示 x 条记录。 2. 使用范围服务来获取和保存您的数据,以便您仅在需要时刷新数据集,而不是每次重新加载视图(页面)时。保存数据的服务未链接到您的页面/视图。如果你有兴趣,我会给你一些资源。
-
@MrCakaShaunCurtis 是的,有关范围服务的一些信息会很有帮助。谢谢。