3

您将如何使用 mvc/razor 实现具有“动态属性”的模型?我真的不确定“动态属性”是否是正确的术语。

场景:我有一个来自数据库的项目列表。然后从属性列表(也来自数据库)中为每个项目提供一组“属性”。

在我的项目模型中,我认为我应该有一个属性/属性的集合,对吗?就像是

public class Item
{

    public int ItemId { get; set; }
    public string ItemName{ get; set; }

    public virtual ICollection<Attribute> Attributes { get; set; }
}

public class Attribute
{
    public int AttributeId { get; set; }
    public string AttributeName { get; set; }
}

我的目标是呈现一个视图,这样如果用户从下拉列表中选择一个项目,与所选项目关联的属性集将与相应的 html 输入元素(文本框或下拉列表)一起显示。

用户从下拉列表中选择项目时的示例 UI(假设它是“相机”)

  • 相机
    • 品牌 - [文本框]
    • 模型 - [文本框]
    • 保修 - [保修期限下拉列表]

用户从下拉列表中选择项目时的示例 UI(假设它是“房子”)

  • 房子
    • 建筑面积 - [文本框]
    • 房间数量 - [文本框]
    • 房间数量 - [文本框]

创建/编辑/删除像上面定义的属性这样的简单模型是没有问题的。让我失望的是实现上述“动态属性”的方式。

我来自 WebForms,但对 MVC 还是很陌生,所以放轻松好吗?:)

4

2 回答 2

2

这种方法的名称简称为 Entity-Attribute-Value 或 EAV。正如您毫无疑问地意识到,当您需要大量不同的元数据并且并非每个项目都有每个适用的部分或简单的数据不可用时,这是一种有用的方法。医疗行业经常使用它来构建患者记录。这是一篇关于它的维基百科文章:

http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model

结合 ASP.Net MVC 搜索它,您可能会找到一堆关于如何正确实现它的好资源。

于 2012-11-22T21:00:44.827 回答
0

事实证明,这可以像任何其他模型实现一样轻松完成。我只需要创建“项目模板”,其中包含与项目属性相关的属性和其他元数据。然后我要求用户选择一个“模板”,以便我可以相应地更新属性列表和视图。之后,用户现在可以为模板中的每个属性填写相应的值。生成的模型与项目模板不同,因此涉及部分视图和编辑器模板。

我知道这与问题无关,但我想值得一提的是,使用视图模型而不是域模型可以简化事情。很多。

为了让事情变得更容易,我必须做的另一件事是使用面向文档的存储而不是传统的关系数据库,因为我认为像这样的 EAV 类型的项目更适合 NoSQL。

我面临的下一个问题是如何根据此处属性的数据类型来验证用户的输入。

于 2013-01-30T12:46:35.717 回答