排序逻辑应放置在模型,视图还是控制器中?
我有一个下拉列表,可以将表格中的值显示给最终用户。 我希望将这些值按字母顺序排序。
根据适当的MVC设计,我应该在哪一层放置我的排序逻辑:模型,视图还是控制器?
编辑 :在回应LarsH的问题时,“你的意思是代码决定了排序的顺序是什么?或者是执行排序的代码?”,我最初指的是决定排序顺序的代码。
(注意:引用和引用来自@ dasblinkenlight的答案,但我们不同意我们对它的解释,请阅读他的帖子并自己决定)。
根据MVC的描述,
控制器可以将命令发送到其关联视图以更改视图对模型的显示(例如,通过滚动文档)。 它可以向模型发送命令来更新模型的状态(例如编辑文档)。
排序逻辑(例如排序比较器/排序算法)属于模型,因为它包含业务规则和状态数据。 由于改变模型数据排序的方式直接落入“更改视图的模型表示”类别,因此控制器通过调用model.changeSortedState()方法负责“执行排序”。
谁控制排序顺序?
(来自维基百科)
1)数据本身内的自然顺序:
该命令是模型的一部分,所以它应该去那里。 “所有数据”的原始数据将以排序顺序返回数据,并且没有界面可以选择排序顺序。
2)用户应该控制他们如何看待数据:
该视图将提供一个与控制器交互的界面(例如,上升/下降箭头),并且该模型足够好地理解数据以对数据进行所要求的排序。 然而,与(1)不同,对数据的原始抽取并不一定需要进行排序。
在任一情况下,
视图不了解有一种情况正在发生,除此之外显示选择哪种排序方向的能力。 不要把逻辑放在那里。
小警告
在一种情况下,我可以纯粹在视图中进行排序功能(我能想到的是,可能会有更多):
一种“哑巴”的排序,其中所有数据已经在视图中,并且不必使用任何领域知识来进行排序。 例如,非常简单的字符串或数字比较。 例如,当结果可能跨多个页面拆分时,这不可能用于网页上的搜索结果。
根据MVC的描述,
控制器可以将命令发送到其关联视图以更改视图对模型的显示(例如,通过滚动文档)。 它可以向模型发送命令来更新模型的状态(例如编辑文档)。
据此,排序逻辑属于控制器,因为改变模型数据排序的方式直接落入“改变视图的模型表示”类别。
编辑:澄清在评论中表达的多个误解,“排序逻辑” 不是执行排序的代码; 它是定义排序的代码。 排序逻辑将各个项目彼此进行比较以建立订单(例如通过IComparator<T>
的实例)或者包含构建用于由外部系统排序的对象的逻辑(例如,通过IOrderedQueryable<T>
的实例) )。 这个逻辑属于你的控制器,因为它需要与应用程序的“业务”相关的知识。 执行排序是完全足够的,但它与实际执行排序的代码是分开的。 排序的代码可能在您的视图中,在您的模型中,甚至在支持您的模型的持久层(例如您的SQL数据库)中。
上一篇: Should sorting logic be placed in the model, the view, or the controller?
下一篇: How to map View Model back to Domain Model in a POST action?