多个动态填充的下拉列表

时间:2009-07-24 14:47:14

标签: asp.net-mvc

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

看起来似乎每个人都对此感到困惑,我会详细说明。

  • 这与缓存无关,这不是问题所述
  • 这与DropDownList等ASP.NET控件无关,我将其标记为asp.net-mvc
  • 这与代码隐藏模型无关,我认为我最初将这个问题标记为ASP.NET MVC是隐含的显而易见性

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

所以在基本的,我想在我的视图页面上有大约10个下拉列表,所有这些列表都填充了数据库中的数据(不断变化)。让他们了解观点的最佳方法是什么?

4 个答案:

答案 0 :(得分: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)) %>

答案 1 :(得分:1)

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

答案 2 :(得分:0)

这实际上是一个数据管理问题,与HtmlHelpers没有任何关系,直到你完成了非常尖端的事情。无论如何,我要问自己的第一件事是“这些数据如何更新,我需要什么样的过滤?”

如果这个列表非常不变,那么你可以进行一些缓存。

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

无论哪种方式,你可能都想在某种LookupService类中包装,但还不足以继续提出任何更具体的建议。

答案 3 :(得分:0)

我第二次怀悦的建议是,如果列表是流动的,每次都要从DB中抓取。

然而,我正在做类似的事情(每页有10个以上的下拉列表,都非常静态......值很少会改变)。

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

所以...我的新版本:

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

希望有所帮助, 詹姆斯