如何在ListBox中加载大量数据? ASP.NET MVC应用程序

我正在使用ASP.NET MVC应用程序。

要求用户能够从ListBox中选择可包含超过30,000个条目的项目。

是否有动态方法使用Ajax调用填充此ListBox的内容 – 这将表现良好?

只是在服务器上填充ListBox控件然后让用户等待页面呈现30,000个条目时,我会更好吗?

如果我采用某种jQuery解决方案,性能会更好吗?

关于如何最有效地处理这种情况的任何建议(没有客户改变要求:-))?

这听起来像个坏主意 – 30,000个条目? 如果你必须从这个尺寸的列表中选择,你会有什么感受?

对这种用例最好使用自动完成function。

我不会像其他人已经做的那样试图回答这个问题:

在企业应用程序中经常会出现这种类型的控件:下拉控件和包含数千个条目的列表。

有些程序员只需用锤子拧螺丝。 http://homepage.mac.com/bradster/iarchitect/images/list2.gif

错误地使用它的程序员通常会得到一个提示,当他们发现加载表单需要非常长的时间时,它可能是不合适的。

1996年12月11日发布在Visual Basic程序员论坛中的以下消息是典型的:

我想用2000个项目填充一个列表框…这需要超过20分钟。 有任何想法吗?

而在1996年12月16日发布的另一个则不那么典型:

我正在寻找一个可以…持有大量条目(20,000+)的列表框控件

这种笨拙控制的借口往往是对全能武器呼吁的错误解释,“我们必须确保数据的完整性。” 程序员希望确保用户指定有效的条目; 在他们看来,最好的方法是强制用户从列表中进行选择。 如果您在列表中有20,60或甚至100个项目,那就没问题了。 除了这个数字之外,用户一次只能滚动少量项目这一事实导致控件变得难以处理。

想象一下,如果您的硬盘上没有文件夹和目录。 每当您需要指定文件时,都会看到一个下拉控件,其中包含硬盘驱动器上每个文件的名称,并要求您选择要打开的文件。 包括程序员在内的很少人会认为这种方法不是完全不可接受的。

可以以某种有意义的方式组织所有数据,以允许用户更快地访问他或她感兴趣的特定信息。例如,文件被组织到文件夹或目录中。 员工通常按部门,职称或工资等级进行分类。 设计界面以利用适当的组织将允许用户更快地找到所需信息,同时“确保数据完整性”。

这个问题的唯一答案是: 不要 。 您是否曾尝试从包含30,000个项目的ListBox中选择某些内容? 客户有没有这样做过?

更新 :我认为最有效的解决方案是通过电子邮件将指向此页面的链接发送给您的客户,让他了解这个问题引起的普遍恐怖。

听起来像一个完全的疯狂。

如果用户必须滚动30000个条目,用户会感觉如何? 此外,对于没有完美眼睛的用户和稍微未开发的运动技能来精确操纵鼠标,体验将是痛苦的。

不要这样做。 使用其他方法:

  • 分页内容,可选择使用复选框选择项目
  • 根据各种标准对内容进行排序
  • 为用户分类选项以首先选择正确的类别,然后从一个简短的选项列表中进行选择
  • 如果精确选择并不重要,请尝试使用Ajax技术显示一个列表,其中包含可供选择的建议
  • 为用户添加一个filter字段来定义模式,让其余部分消失

另一个想法是使用支持多列和图标的增强列表。 查看Windows资源管理器。 从带有大图标的几列中选择比从一长串微小文本字符串中选择要容易得多。

您的方法的另一个缺点:在选择列表中同时拥有这么多记录也会将页面大小扩展到几兆字节。 如果启用了视图状态,则会非常慢且占用资源。

如果您预先加载所有内容,性能只会像下载标记并最初渲染一样慢。

如果你通过AJAX调用(jQuery或其他)加载所有内容,它将不得不发出请求,下载结果,解析结果,并将它们渲染到页面……这甚至更慢(特别是对于那些大小的东西) 。

我会问为什么ListBox需要这么多条目。 没有用户能够有效地使用该控件。 也许减少列表的大小并实现分页以使事情更有用?

从性能角度来看,30,000个项目实际上并不多。 试一试,在测试中我已经能够提供多达100,000件物品。

从用户的角度来看,我认为绝对最大值的1,000项可能是可用性方面的限制。 我经常停在100件物品上。 我建议在列表框的正上方添加一个文本框。 允许用户搜索术语。 您可以使用jquery填充该框,或使用更新面板。 如果将结果限制为100个项目,这将非常快。

只需使用一些老式的validation; 不需要包含宇宙中每个已知选项的疯狂列表框。

我通过向用户发送信息来解决它,该查询返回了超过200条记录,然后我只加载了一半; 在那种方式,我建议用户添加另一个filter,以减少记录的数量。 老实说,我希望有一些更好的方法来加载一百个一百个resords,因为用户滚动列表框但没有成功。