如何在mvc/razor中实现具有“动态属性”的模型?

3

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

场景:我有一个来自数据库的项目列表。然后,从属性列表(同样来自数据库)中为每个项目分配一组“属性”。

在我的Item模型中,我认为应该有一组属性/属性集合,对吗?类似于:

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还很陌生,请温柔一点好吗? :)
2个回答

2
这种方法的名称叫做实体-属性-值或简称EAV。正如你无疑意识到的那样,当你需要大量各种元数据时,而不是每个项目都具有每个适用的元素或数据不可用时,这是一种有用的方法。医疗行业经常使用这种方法来构建患者记录。这里有一个维基百科文章介绍它:

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

搜索与ASP.Net MVC结合使用,你很可能会找到许多有关如何正确实现它的好资源。

谢谢您的回答!虽然这难道不应该只是数据库中简单的一对多关系吗?然后只需让控制器根据相关项目属性生成必要的UI逻辑即可? - Andy Refuerzo
可能吧!但通常在使用未曾接触过的设计时,最好先查一下谷歌,因为有时会出现一些意想不到的问题,而其他人可能会在你遇到这些问题之前指出它们。 - Spencer Ruport
是的,我同意!感谢您指出这种方法称为EAV。原问题仍然存在,您如何使用mvc/razor实现具有EAV(“动态属性”)的模型? - Andy Refuerzo

0
事实证明,这可以像任何其他模型实现一样轻松完成。我只需要创建包含与项目属性相关的属性和其他元数据的“项目模板”。然后我要求用户选择一个“模板”,以便我可以相应地更新属性列表和视图。之后,用户现在可以填写模板中每个属性的相应值。生成的模型是不同于项目模板的模型,因此涉及到部分视图和编辑器模板。
我知道这与问题无关,但我想提一下,使用视图模型而不是域模型会使事情变得更加容易。很多。
为了使事情变得更加容易,我必须做的另一件事是使用面向文档的存储而不是传统的关系数据库,因为我认为像这样的EAV类型项目更适合NoSQL。
我面临的下一个问题是如何根据属性的数据类型验证用户的输入here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接