【问题标题】:placment of classes in NerdDinner在书呆子晚餐中安排课程
【发布时间】:2011-07-04 23:44:48
【问题描述】:
我正在学习 ASP.NET MVC 并查看 ASP.NET MVC 示例应用程序NerdDinner。
“模型”文件夹包含一个名为 Dinner.cs 的类。这是主要的晚餐实体。
这堂课不应该在其他地方吗?例如“域”?而是应该将 viewmodel 类放在包含晚餐信息的 Models 文件夹中吗?
为什么文件“PaginatedList.cs”位于名为:“Helpers”的文件夹中。这个文件不应该在文件夹中:“模型”,因为它是提供给视图的?
对此的任何澄清将不胜感激!
【问题讨论】:
标签:
asp.net-mvc
view
model
viewmodel
nerddinner
【解决方案1】:
当然,您对此的想法是正确的。 NerdDinner 仅用于概念演示目的,并没有真正假装所有最佳实践。随着您自己的项目的增长,它变得越来越明显。您将在单独的文件夹中拥有域实体/服务/存储库,然后是单独的项目,然后可能是单独的解决方案。您会发现自己将此文件夹重命名为 ViewModels,以使其对从事项目的其他人更加明显。
PaginatedList 可以是 ViewModel 并包含与分页相关的数据。然后可以放到ViewModels文件夹。但我相信你在 NerdDinner 中所拥有的 - 只是一个简单的 View 助手来生成分页标记。此外,助手可能不是那么严格的“视图”或“视图模型”——它们可以包含简单的逻辑,它们在某种程度上处于视图和视图模型之间的中间:)。另请注意, PaginatedList 更多的是“框架”问题,而不是“特定解决方案”。所以你不能把它放在项目特定的东西中的“视图”或“模型”文件夹中。所以“Helpers”对于 NerdDinner 来说已经足够好了。在真正的解决方案中,您最好将其通用化,将其包含在 MVC 之上的“框架”中。
【解决方案2】:
对于第一个问题,Dinner.cs 文件包含 Dinner 类的一部分以及伙伴类的一些验证属性。恕我直言,将此文件放入Model 文件夹是完全理智的,因为它实际上是解决方案模型的一部分。
对于您的第二个问题,PaginatedList 是一种数据结构,可让您一次查看数据的某个“页面”(一组固定的元素)。我真的不认为它是一个ViewModel,它就是一个“助手”。
我想补充的另一件事是,如果您有一些 ViewModel 传递给您的视图而不是实际的模型类,或者因为您有一组特定的数据元素要传递,我认为它会是有一个单独的ViewModel 文件夹是合理的。
希望这会有所帮助:)