【问题标题】:Multiple Dynamically Populated Drop Down Lists多个动态填充的下拉列表
【发布时间】:2009-07-24 14:47:13
【问题描述】:

我有一个页面,其中包含从我的 SQL 数据库生成的大约十个下拉列表。填充它们的最佳方法是什么?我打算使用带有 LINQ 的存储过程来返回多个结果集,但这似乎有点矫枉过正。还有另一种方法吗?使用 HtmlHelpers 或类似的东西?

看到大家似乎对此感到困惑,我会详细说明。

  • 这与缓存无关,这不是问题所在
  • 这与 DropDownList 等 ASP.NET 控件无关,我将其标记为 asp.net-mvc
  • 这与代码隐藏模型无关,我认为从我最初将这个问题标记为 ASP.NET MVC 的方式可以看出这一点

问题是下拉列表的页面需要多个结果集(想想 HTML!)。所以我有一个你最喜欢的獾品种的下拉列表,一个你有多少生日的下拉列表,一个今天天空中有多少云的下拉列表。所有这些都是动态填充的(请注意,我在开玩笑,这是我工作的金融系统)。我需要所有这些都出现在我的视图页面上,但我宁愿不在 LINQ 存储过程中使用 IMultipleResult 返回类型来带回多个结果集。它只是变得混乱。

因此,基本上,我希望在我的视图页面上有大约 10 个下拉列表,所有这些下拉列表都填充了来自数据库的数据(这些数据不断变化)。让它们出现在视图中的最佳方法是什么?

【问题讨论】:

  • 问题是什么?你在问什么应该是从数据库中检索数据的最佳方法(你在使用 Linq2Sql 吗?)?或者如何创建视图(你有任何 ModelView 类吗?)?
  • 我不确定您希望我如何更清楚。我正在尝试从数据库中取回数据并使用该数据填充诸如下拉列表之类的内容。我正在寻找将多个结果集返回到视图的最佳方法,而无需在我的 dbml 文件的部分类中使用带有 IMultipleResult 接口的存储过程。我想知道有什么替代品。
  • 您的问题可以通过更具体地说明您的具体处理方式来澄清。您使用的是 ASP.NET DropDownList 控件吗?你在使用 C# 代码隐藏吗?请提供更多上下文和详细信息。
  • 我将其标记为 asp.net-mvc,因此我认为很明显没有使用代码隐藏模型,也没有使用旧的 ASP.NET 控件。

标签: asp.net-mvc


【解决方案1】:

如果您想要强类型访问,我只会将所需的数据传递给视图,或者在多个 ViewData 字典中,或者作为特殊的视图模型。然后使用 HtmlHelper.DropDownList() 来显示实际的下拉菜单。

弱类型解决方案

控制器

ViewData["Data1"] = SomeRepository.GetList();
ViewData["Data2"] = SomeRepositoty.GetList();
return View();

查看

<%= Html.DropDownList("Data1") %>
<%= Html.DropDownList("Data2") %>

强类型解决方案

查看模型

public class DataViewModel
{
    public IEnumerable<string> Data1 { get; set; }
    public IEnumerable<string> Data2 { get; set;}
}

控制器

var model = SomeRepository.GetModel(); // returns an instance of DataViewModel
return View(model);

查看

<%= Html.DropDownList("Data1", new SelectList(Model.Data1)) %>
<%= Html.DropDownList("Data2", new SelectList(Model.Data2)) %>

【讨论】:

  • 是的,基本上多个结果集被传递给视图,这是我已经做的事情。只要我知道这是正确的方法,我仍然很乐意这样做。顺便说一句,你把你的视图模型放在哪里?似乎很流行不将它们放在模型目录中。
  • 其实我把它们和其他模型类放在一起。我只是没想到,在 Web 窗体项目中,我曾经为类似的域模型类提供单独的程序集(“域模型”是指在应用程序的业务域中有意义但不转换为数据库的实体表 1:1,因此它与 MVC 视图模型类,IMO 相同)。
【解决方案2】:

这取决于数据,如果数据库中的数据不经常更新,那么您可以有一个每天创建一次 XML 文件的过程。然后使用 XML 文件作为下拉菜单的来源,这将加速应用程序并限制对数据库服务器的调用。

【讨论】:

  • 这听起来是个好主意。这很难做到吗?
  • 我的做法是在数据库中编写一个每天运行一次的存储过程并将文件通过 ftp 传输到网络服务器。
【解决方案3】:

这实际上是一个数据管理问题,与 HtmlHelpers 没有任何关系,直到您达到非常尖锐的目的为止。无论如何,我首先要问自己的是“这些数据是如何更新的,我需要什么样的过滤?”

如果这个列表几乎是不变的,那么您可以进行一些缓存。

如果此列表非常流畅,则只需根据需要将其从数据库中拉出并完成。如果您的数据库盒开始融化,请担心缓存。

无论哪种方式,您都可能希望将内容封装在某种 LookupService 类中,但不足以继续提出更具体的建议。

【讨论】:

    【解决方案4】:

    我赞同 Wyatt 关于每次从数据库中获取的建议,如果列表是流动的。

    但是,我正在做类似的事情(每个页面上有 10 多个下拉菜单,都非常静态...值很少会改变)。

    应用程序的第一个版本为每个下拉列表(项目结束时总共大约 20 个)都有一个帮助方法,该方法从各个表中抓取并通过另一个帮助程序缓存。在我开始缓存之前,视图没有可用的数据库上下文(我在控制器中创建它但没有传递它),每个下拉列表都必须创建一个新连接。这明显变慢了。另外,我的缓存例程存在一些问题,并在缓存中使用 20 个魔术字符串保存它们,等等。此外,我有一个单独的查询对象,我必须手动构建关系,并且必须为内部创建 20 个关系加入是一种痛苦。

    所以...我的新版本:

    我正在使用一个“可选”表。有一个 PK 和一个“可选类型”(我不得不承认它是一个字符串)。有一个可枚举的可选择项,这使事情变得更简洁。有一个主要的 getAllSelectables() 方法在缓存中查找整个结果集(如果它不在缓存中,则从数据库中获取所有行)并返回它。然后有一个 getSelectables(enum) 只获取相关值,第三个函数 getSelectListItems(enum) 调用 getSelectables(enum) 并为 mvc 辅助函数返回一个 ienumerable。

    希望对您有所帮助, 詹姆斯

    【讨论】:

    • 但实际上,答案是使用HtmlHelpers?
    • 是的。另一种方法是将它们全部从控制器保存到您的视图模型中。这可能是控制器和视图的更清洁、更正确的分离,但我发现 html 助手是最简单的。 (如果您要在控件中执行此操作,方法可能大致相同,包括获取值、缓存、作为选择列表项返回等)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 2023-04-03
    • 2020-06-26
    • 2015-12-11
    • 2019-06-06
    • 2014-03-01
    相关资源
    最近更新 更多