是否有任何充分的理由将逻辑(方法)放入视图模型类中

时间:2011-01-11 21:01:18

标签: asp.net-mvc asp.net-mvc-2

我今天正在进行代码审查,看到有人拥有视图模型类,除了数据之外,还包含不同的方法,例如

GetTable, GetPdf, LoadSomeData etc.

我个人不喜欢它,因为喜欢有一个“普通”视图模型类,只包含属性并将逻辑放入Controller或者附加服务。

但在审查时,我无法找到好的论据。

您如何看待,在视图模型类中使用逻辑是一种好方法(样式)吗?什么是利弊?

编辑:这是ASP.net MVC2应用程序。 编辑:此类代码的示例(仅从头部开始)..

public ActionResult SomeAction()
{
   var model = new ViewModel();
   model.LoadSomethingFromSomething();
   model.AnotherMethod();

   return View(model);
}

3 个答案:

答案 0 :(得分:2)

分离关注点单一责任主体的原则规定视图中应该包含的唯一“逻辑”应该是操纵视图的方式显示数据。其他一切都应该在控制器中。在语义上,视图做了一件事 - 显示数据,与显示所述数据无关的任何事情 - 即操纵数据,格式化数据,加载数据,转换数据等应该由控制器处理。

在现实世界中,我们并不总是拥有理想主义的奢侈品,但在理想世界中,它应该是它应有的方式。 最少惊喜的原则表示代码应该在最不可思议的地方找到它。如果我(作为代码维护者)需要修复某些东西,我需要能够快速找到它 - 如果不是逻辑指示我会找到它,它会为我快速有效地完成任务提供不必要的障碍。

如果GetTable适用于为视图加载表构造(即HTML表),那么可能它是相关的,如果我们谈论从数据库获取表数据,那么它不是。

答案 1 :(得分:1)

你的问题对我来说很模糊。当您说视图模型时,您是指从视图消耗的域模型构建的视图特定模型吗?在这种情况下,我同意视图模型应该非常简单。观点不应该“思考”太多(理想情况下,它根本不应该“思考”)。从视图中调用方法(未在帮助程序中定义),甚至在视图中进行分支,对我来说是一种代码味道。

IMO,控制器也应该轻薄。我喜欢我的模型中的大部分逻辑以及数据访问层。仅仅取决于我们所谈论的逻辑类型。

答案 2 :(得分:1)

我曾经认同完全“愚蠢”模型的想法.I。那些不做任何事情的人。然而,在实践中使用这个想法后,我发现它并不理想。我现在赞同viewModels应该知道如何从其他对象创建自己的想法。

public ActionResult SomeAction(int? id)
{
   var serviceModel = _myService.Get(id ?? 0);
   var model = new ViewModel(serviceModel);

   return View(model);
}

基本上,不是在模型中添加方法,而是创建几个构造函数,这些构造函数接收在视图模型创建中使用的对象。这可以释放您的控制器和放大器。通过了解viewModel如何工作的任何事情来服务(意味着没有对象映射代码包含所有内容)。

然后,要从viewModel中获取对象,可以执行以下操作:

[HttpPost]
public ActionResult SomeAction(ViewModel model)
{
   _myService.Update(model.MapToServiceModel() );

   return SomeAction(model.id);
}