根据我的阅读,我理解我们应该始终将视图模型传递给视图。但是,有时这个视图模型与EF模型完全相同或几乎相同。这个问题(重复代码)是否可以接受或有任何解决方法?
例如,如果我有这个EF模型:
class UserModel
{
string id {get;set}
string name {get;set}
string address {get;set}
string phone {get;set}
string website {get;set}
}
viewmodel应该如何......像这样:
class UserViewModel
{
string name {get;set}
string address {get;set}
string otherobject {get;set}
}
或者像这样:
class UserViewModel
{
UserModel user;
string otherobject {get;set}
}
使用选项#1,重复属性...在另一个视图模型中,它们将再次重复。我需要在每个视图模型上重复所有数据注释。但是,我只发送了我需要的属性。
使用选项#2,没有重复,但我传递了许多我不需要的属性。
最后一个选项是根据需要混合选项#1和选项#2 ......但由于缺乏通用标准,我不喜欢这个选项。有时,属性将在视图模型中定义和数据注释,有时在EF模型中定义。
我希望有一个选项#4,我看不到......?
谢谢。
答案 0 :(得分:2)
这些类的不同之处在于您的应用程序与之交互的方式。 模型和 ViewModel 有不同的受众群体。
您的模型应该与您的应用程序进行交互,有时很多人更喜欢在EF Code First中将这些模型用作实体。它们就是我们所说的Domain Objects。
另一方面, ViewModels 应该与您的视图进行交互。在服务层中,您使用某些数据填充 ViewModel ,然后您可以从控制器访问它们。
但是,有时这个视图模型与EF模型完全相同或几乎相同。
此处的关键字是“有时”。你是对的,对于一个非常简单的应用程序,你甚至不需要考虑 ViewModels ,在大多数情况下你可以简单地使用你的模型。但是,请考虑一些情况,例如您要显示最新帖子列表,最新评论,并说明一些相关帖子单一视图。你要做什么?这是 ViewModels 的来源。您将特定的 ViewModel 传递给您的视图,其中包含所有必要的数据,帖子,评论和相关帖子。
在大多数情况下, ViewModel 应该来自多个模型,有时候, ViewModel 的porperties
是模型
答案 1 :(得分:1)
我知道自问这个问题以来已经有一段时间了。但是,这可能有助于寻找答案的人。
尽管ViewModel与模型几乎相同,但建议使用相同的代码创建ViewModels。
可能的原因是
您可能希望使用数据注释向属性添加验证。 建议不要进行更具体的验证 屏幕在您的模型中应该是您的反射 数据库结构。
您的ViewModel将来可能会发生变化。现在可能没有意义,但是 总有可能。
如果您担心映射代码在大多数情况下看起来很明显,您可以使用Automapper。
干杯!