0

我在哲学上想解决的问题是 DropDownList 项(或实际上任何类型的选择列表项)是否应该成为模型的一部分,或者是否应该将它们硬编码到 UI 或业务层中。或者也许这是 ViewModel 的一个很好的用途?

对于某些类型的下拉列表,您显然必须使它们成为模型的一部分。例如,模型必须生成与客户关联的订单 ID 的下拉列表。

我称之为“查找”数据的其他类型对我来说不太清楚。例如,性别。为什么要强制往返查找用 2 个项目填充字段?也许这是过早的优化,但是如果您有 50 个字段,那么为了填充一个页面就需要进行很多往返。当然,缓存在那里可能会派上用场,但看起来很笨拙。

我还担心将所有这些查找列表添加到模型中会造成不必要的混乱。特别是如果你有很多。

也可以选择不是在 UI 中进行硬编码,而是在业务层进行硬编码。甚至可能创建一个除了填充这些数据之外什么都不做的类。

如果答案是,您仍然应该让它们成为数据模型的一部分,那么问题是您的数据模型是否应该为每组查找字段提供不同的表。如果您的数据模型有 200 或 300 个这样的字段,那就是 200 或 300 个表,这确实使维护您的数据模型更加复杂。

不久前我问了一个关于有一个通用查找表的问题,大家一致认为这是一个坏主意。但是对于有很多领域的数据量很大的应用程序,我发现自己很怀疑。

现在,我知道你们中的许多人会说“这取决于”,但我正在寻找一种“一般”的答案。一般来说,这里的经验法则是什么?

4

3 回答 3

2

我一直在参与构建一个包含大量词典的系统。它们中的大多数都存储在一个简单的表中,其中包含字典的 id、项目的 id、它的名称和一些其他基本值。该表中的某些项目具有预定义的 id(例如,男性 = 1001,女性 = 1002),因此如果表具有性别_id 字段,我不必在字典表中查找男性,我知道它的 id。这些 id 仍然在代码中定义为常量,但出于演示目的,它们是从数据库中获取的。它运行良好,性能也不错(数百个字典,数千个项目)。它们可以传递给视图模型中的视图。用于编辑人员的视图模型可能如下所示:

public class PersonViewModel {
    public Person Person { get; set; };
    public SelectList Genders { get; set; };
    public SelectList Departments { get; set; };
    public SelectList Positions { get; set; };
}

您可以使用代码填充视图:

Genders = DictionaryService.GetDictionary(Dictionaries.Genders);
Departments = DictionaryService.GetDictionary(Dictionaries.Departments);
Positions = DictionaryService.GetDictionary(Dictionaries.Positions);

Dictionaries枚举在哪里。

DictionaryService.GetDictionary()方法中,您可以引入某种缓存。

如果要填充下拉列表,可以有无限数量的项目(对于字段,引用其他表,时间增长很多),使用某种增量搜索动态(ajax)加载的项目。

于 2011-02-12T21:35:25.160 回答
1

我将重新表述你的问题。模型就是模型。如果一组备选方案是模型的一部分,那么无论如何它们都是模型的一部分。无论如何实现,数据模型都具有内部一致性和完整性。

那么问题就变成了,是否应该将模型中包含的备选方案集实现为下拉列表?我的回答是肯定的,有时。

对于像“性别”这样的案例,问题是“在不久的将来有多大可能增加性别集合?” 如果很有可能,您最好支付往返费用。如果机会为零,您最好将选择硬编码到 UI 中。

几年前,我会说添加到 [男性,女性] 的集合是完全不可能的。今天,有些人有不同的看法。

于 2011-02-12T20:31:02.450 回答
0

如果您有一个大列表并且需要在服务器上动态过滤它,那么您需要对您的操作进行 ajax 调用。

如果您想呈现带有一堆选项的选择,或者只是一个您将在客户端过滤的 json 值数组,那么我建议您将下拉项添加到您的 ViewModel 并在 Controller 中填充此集合。该列表可能暂时是硬编码的,但您可以稍后通过修改控制器使其成为动态的(即从数据库中读取),而无需触及 ViewModel 或 UI。

查看此链接以获取一些代码示例: http: //odetocode.com/blogs/scott/archive/2010/01/18/drop-down-lists-and-asp-net-mvc.aspx

于 2011-02-12T20:28:52.563 回答