在 MVC 中将视图状态之类的选择放在哪里?

Posted

技术标签:

【中文标题】在 MVC 中将视图状态之类的选择放在哪里?【英文标题】:Where to put View State like selections in MVC? 【发布时间】:2012-03-04 19:56:26 【问题描述】:

在 MVC 中,模型包含域的数据和逻辑,视图向用户显示信息并提供用于交互的小部件(如按钮),控制器处理输入(如按钮按下)。

但是视图的状态属于哪里呢?

例如,如果您有一个国际象棋游戏,您可能希望跟踪选择了哪个图形以及突出显示了哪些字段(您可能希望突出可能的移动)。

我读到了演示模型http://martinfowler.com/eaaDev/PresentationModel.html,这是一种实现方式。

我可以想到其他方法:

使用第二个模型,它只保存选择和突出显示 将此信息放入视图中(但随后我们在 GUI 中有某种逻辑) 将其放入控制器(但随后我们需要手动将视图与控制器状态同步) 包装域模型(或从它继承)并向其他数据添加选择和突出显示(这有点是表示模型)

但是在mvc中这样做的“正常”方式是什么(如果有正常方式的话),或者你使用或推荐哪种方式?

【问题讨论】:

这里也有人问过类似的问题:***.com/questions/443910/… 感谢链接。但是这个线程是高度特定于网络的。我主要针对桌面环境,例如不要使用会话。 【参考方案1】:

好吧,视图不应该真的有状态。它应该显示控制器告诉它显示的任何内容。如果您想知道选择了哪个棋子,您可以在控制器中跟踪它,控制器将通过视图模型传递视图哪些方格有效。

将所选片段等保留在控制器中的原因是因为它是游戏状态的一部分,而游戏状态又是业务逻辑的一部分。业务逻辑属于控制器。我假设有一个视图模型,因为应该总是有一个视图模型,除非它等同于模型本身。在大多数应用程序中,它是不等价的,如果没有视图模型,您会失去封装,增加视图和控制器之间的耦合,并使整个事物更容易改变。

【讨论】:

我同意,视图不应该有状态。但是为什么选择属于控制器呢? (我并不是说这是一个坏主意,但我真的不知道,为什么它最适合那里)。而且您似乎假设有一个视图模型,它或多或少与表示模型相同。这个视图模型是如何实现的?它是域模型的包装器吗? 有一段时间没来得及登录这里,但我编辑了回复来回答问题。 感谢您的帮助!还有一个问题:你建议我如何实现视图模型?我是否应该包装域模型并具有从域模型转发数据的访问方法以及针对视图特定状态的其他方法? 这是一个在不了解更多情况下很难回答的问题 :) 一般来说,控制器的工作是抓取模型的相关部分,对其执行逻辑以获得视图所需的数据表示.在您提到的国际象棋示例中,它将以优化计算的方式从模型中获取表示,将其转换为适合渲染的表示,并与可能的移动(由控制器计算)一起表示将是视图模型.请记住:视图需要非常瘦,所有逻辑都需要在控制器中。

以上是关于在 MVC 中将视图状态之类的选择放在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

在 mvc JavaScript 中的下拉更改选择上加载列

React - 在下拉选择中将状态从子级传递给父级

如何在mvc中保留复选框选择?

在 ASP.NET MVC 中将 ID 放在 <body> 上

如何在MVC C#中将文本框和下拉值从视图传递到控制器

带有回发的 MVC 组件