asp.net下拉列表缓存巨大的数据
我必须将近50k记录绑定到我的asp.net下拉列表中,并且必须可以搜索。 实施它的最佳方法是什么? 是否有任何缓存技术,以便在我们滚动时加载列表?欣赏建议。
请指教。
您可以通过使用Web服务来实现此目的。
首先在aspx页面中添加以下代码。
现在,使用以下代码创建Web服务。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; using System.Data.SqlClient; [System.Web.Script.Services.ScriptService] public class WebService : System.Web.Services.>WebService { [WebMethod] public List ShowCountryList(string sLookUP) { List lstCountries = new List (); string sConnString = "Data Source=DNA;Persist Security Info=False;" + "Initial Catalog=DNA_CLASSIFIED;User Id=sa;Password=;Connect Timeout=30;"; SqlConnection myConn = new SqlConnection(sConnString); SqlCommand objComm = new SqlCommand("SELECT CountryName FROM Country " + "WHERE CountryName LIKE '%'+@LookUP+'%' ORDER BY CountryName", myConn); myConn.Open(); objComm.Parameters.AddWithValue("@LookUP", sLookUP); SqlDataReader reader = objComm.ExecuteReader(); while (reader.Read()) { lstCountries.Add(reader["CountryName"].ToString()); } myConn.Close(); return lstCountries; } }
最后,使用webservice创建绑定Textbox的jquery方法,
我建议利用jQuery的自动完成插件:
https://jqueryui.com/autocomplete/
它是可配置的,并且具有开箱即用的自动完成搜索function。 它也可以使用您的远程数据源(尽管您可能会考虑分页API响应):
在后端,创建一个controller action
(如果您使用的是ASP.NET MVC)或一个page method
(如果您使用的是ASP.NET Web窗体),它接收一个searchTerm
参数并返回一个顶部数组(例如,100 )结果。
在前端,使用类型之一/ 自动完成插件,例如此插件。 当用户设置搜索词时,对后端执行Ajax请求并显示结果。 执行Ajax请求时 ,您还可以启用和配置缓存。 不再需要优化。
使用自动完成文本框并从远程API设置数据源,尤其是在处理大型数据集时。 这样可以避免应用程序UI在每次字符搜索时被挂起。
参考链接: https : //github.com/ghiden/angucomplete-alt
取决于列表项的来源。 如果他们来自列表或数据库只是附加他们然后使用JavaScript搜索列表。
public class Department { public int Id { get; set; } public string Name { get; set; } } private static List GetDepartment() { List departments = new List (); for (int i = 0; i < 10000; i++) { Department department = new Department(); department.Id = i; department.Name = "Department " + i.ToString(); departments.Add(department); } return departments; } [WebMethod] public static List GetDepartment(string departmentName) { int totalDepartments = GetDepartment().Count; List departments = GetDepartment().Where(d => d.Name.ToLower().StartsWith(departmentName.ToLower())).Take(20).ToList(); return departments; }
我遇到了和你一样的问题,我使用了RadAutoCompleteBox 。 它有许多客户端和服务器端事件,可以帮助您处理各种情况。 它非常适合ASP.NET项目。
我看到两个直接的解决方案。
- 正如其他人建议使用ajax搜索相关项目作为用户类型并显示它们。
- 在页面加载时获取所有数据并将它们存储在javascript变量中,然后您可以对该变量执行搜索作为用户类型并将搜索结果绑定到下拉列表。
与此相似:
绝对任何自动完成实现都适用于您的场景。
解决方案1:使用自动完成选择框
- 如果您不想浪费带宽或想要支持低规格的设备,则应该使用服务器端数据获取来进行自动完成。
- 如果您想要高可用性而不关心带宽,则可以将自动完成function与本地数据一起使用(一次获取50k记录并绑定到自动完成)。 但要确保您不会一次将所有这些绘制到DOM中。 您需要限制在特定时间显示的记录。
解决方案2 :使用select with virtual
-
但是如果你想为你的客户提供最好的可用性 ,你应该选择一个解决方案,你的选择框被虚拟化 ,数据在滚动选择框时被加载到
DOM
中。 通过虚拟化,您可以确保只有那些项目被推送到DOM ,这些项目在那个时间点显示在屏幕上。你可以在这里找到一个基于jQuery的虚拟选择
React中的类似实现