我有一个下拉列表,显示值从表给最终用户。 我想有这些值按字母顺序排序。
根据适当的MVC设计,在哪一层,我应该把我的排序逻辑:模型,视图或控制器?
编辑 :在回答LarsH的问题,“你的意思是执行排序的代码,确定什么样的顺序需要或代码?”,我本来指的是确定哪些排序顺序所需的代码。
我有一个下拉列表,显示值从表给最终用户。 我想有这些值按字母顺序排序。
根据适当的MVC设计,在哪一层,我应该把我的排序逻辑:模型,视图或控制器?
编辑 :在回答LarsH的问题,“你的意思是执行排序的代码,确定什么样的顺序需要或代码?”,我本来指的是确定哪些排序顺序所需的代码。
(注:这句话和引文摘自@ dasblinkenlight的答案 ,但我们不同意我们对它的解释看他的岗位和弥补自己的心态。)。
据MVC描述 ,
控制器可将命令发送到其相关联的视图改变视图的模型的介绍(例如,通过经由一个文档滚动)。 它可以发送命令到模型更新模型的状态(例如编辑文档)。
排序的逻辑(例如,排序比较器/排序算法)属于,因为它含有业务规则和状态数据模型。 由于改变模型数据的排序方式正视落入“更改视图的模型展示”类别中,控制器负责“做排序”通过调用model.changeSortedState()方法。
(From Wikipedia)
The order is part of the Model, so it should go there. A raw pull of "all data" would return the data in the sorted order, and there is no interface to choose the sort order.
The View would provide an interface (such as ascending/descending arrows) that interact with the Controller, and the Model understands the data well enough to do the requested sort on the data. However, a raw pull of the data doesn't necessarily have to be sorted, unlike in (1).
The View doesn't understand that there's a sort going on, other that the ability to show which sort direction has been chosen. Don't put the logic there.
The sorting functionality could go purely in the View, under one circumstance (that I can think of offhand; there may be more):
A "dumb" sort where all the data is already in the view and it doesn't have to use any domain knowledge to do the sort. Very simple string or number comparison, for example. This is not possible in, for example, search results on a webpage when results are likely to be split across multiple pages.
据MVC描述 ,
控制器可将命令发送到其相关联的视图改变视图的模型的介绍(例如,通过经由一个文档滚动)。 它可以发送命令到模型更新模型的状态(例如编辑文档)。
据此,排序逻辑属于控制器,因为改变模型数据的排序方式正视落入“更改视图的模型展示”类别。
编辑:为了澄清评价浊音多个误解,将“排序逻辑” 不是执行排序的代码; 它是定义排序的代码。 该排序逻辑个别项目进行比较,以相互建立的顺序(例如,通过的一个实例IComparator<T>
或包含构建一个目的是由外部系统被用于排序逻辑(例如,通过的一个实例IOrderedQueryable<T>
)。 此逻辑属于你的控制器,因为它需要知识相关的应用程序的“生意”的一面。 这是完全足以执行排序,但它是从实际执行它的代码分开。 这种种可能在你看来,你的模型,甚至在你的备份模型(例如SQL数据库)的持久层的代码。
以上都不是。 排序是业务逻辑和业务逻辑不以任何三个属于。 不要在你的应用程序每一段代码将是一个模型,视图或控制器。
我一般做在我的MVC应用程序是我必须执行所有的业务逻辑的服务层。 在服务层的方法应该有很好命名参数干净,简单的API。 然后,您可以调用这些方法从你的控制器来操作模型的数据。
在这个意义上,排序是“控制器”,但这不应该在控制器实现排序的代码本身,只有从那里调用。
Definetly不是控制器:它发送消息,查看和模型,但应该做尽可能少的工作越好。 如果用户可以改变分选请求被由控制器通过通知模型或关于它的视图处理。
也许查看,如果它是一个纯粹的观事。 如果应用程序的工作方式以及不排序,然后排序只是表示的部分,并在视图应该去。
如果排序是域的固有部分,应该走在模型中。
因此,选择是 - 你认为这是域业务逻辑或表示逻辑的一部分。
如果你正在实施一个正确的MVC模型2或古典MVC模式,那么我会说,通过模型层提供数据的排序应该由视图的请求到模型层被触发。 查看询问有序的数据,模型层提供它。
但是,因为你正在使用MVC模式的ASP.NET MVC的解释,这是一个有点不同的,那么你的标准的MVC - 视图模型实例应该从模型层(由于某种原因,ASP.NET框架要求有序信息认为,模板应该叫“意见”和视图应该叫“的ViewModels” ..这是奇怪)。
我通常会做的控制器保持队形与图案按其他的答案。 请参阅下面的推理。
我一直在琢磨这种过度和阅读的答案和相关材料,并务实地说,我会说这将取决于你的应用程序,例如:
它是一个中型/大型应用程序和/或拥有多个与之相关的UI的(即Windows应用程序,Web界面和手机界面)。
如果它是一个良好定义的单一用户界面的网站,你正在使用类似EF代码第一次和你没有或者没有建立使用一个简单的开箱扩展方法来acheive它的服务层和计划的意向:
如果其与上述相同,但不能与开箱扩展方法来实现。
总结一下:
教条主义的答案:服务层
务实的答案:通常情况下,控制器
我建议从表中数据是足够小到可以在下拉有用的数据排序列表应该来自DB通过查询已经排序。 对我来说,这使得该模型应用于排序的地方。
如果你立志做排序的手,我想有使用的型号或控制器逻辑首选点,是良好的论点。 该限制将是你的特定的框架。 我更喜欢仅在模型来管理数据。 我使用控制器结婚,因为我已经(个体经营)教数据(模型)和演示(视图)。
虽然我原则上同意的想法,排序是业务逻辑,因为它分解到它的起源,你最终会像“客户希望产品页面显示与按日期排序图像”,那么它变得清晰,对于数据的排序顺序通常不是任意的 - 即使没有排序因为这是仍然不作为一个商业决定(空单仍然是一个列表)。
但是...这些答案似乎没有考虑到ORM技术的进步,我只能相对于实体框架谈微软(让我们避免这样做是否是真实的ORM的说法,这不是点)作为这就是我所用,但我敢肯定,其他奥姆斯提供类似的功能。
如果我创建了一个产品类使用MS MVC和实体框架一个强类型的视图,并有产品与形象的表之间的外键关系(例如FK_Product_Image_ProductId),那么我会出的现成能够快速排序使用这样的事情在他们的观点中显示图像:
@foreach(Image i in Model.Image.OrderBy(e => e.DisplayOrder)){ //etc etc... }
有一个具体的业务逻辑层,这也是我用它来执行我的业务逻辑的80%的提及,但我不打算写排序功能为我的业务逻辑层,模仿的东西,出来的最箱从实体框架。
我不认为有一个正确的回答这个问题,只是说那; 你应该抽象复杂的业务逻辑在可能的情况,但不重新发明轮子的成本。
假设您有MVC的网站,网站的WebForms和移动应用程序。
如果您想排序是这些演示文稿层之间一致的,那么我会排序外的表示层的说。 服务将是一个不错的人选。
否则,我将这一逻辑存储在一个视图模型。 为什么? 因为它会重复使用,容易测试。
出您列出了三个,我会说,它所属的控制器。 我真的不喜欢把这种逻辑控制器,虽然。 我通常创建,该控制器与该通信将负责与数据存储进行通信和处理排序逻辑服务层。 对于小型应用来说是罚款坐在控制器,虽然。
这是在头脑里的asp.net问了一个问题,但因为的确有人提到Rails的,我认为这将是有趣的考虑这方面的问题。 在Rails中,它是天然的和很常见到与所述检索作为控制器动作沿着执行排序,因为框架和ActiveRecord的/ ActiveQuery API规定它。 在另一方面,它可以定义某种自定义排序顺序为静态的项目,并将该模型由控制器使用,因此该模型可以在排序逻辑发挥作用,即使它不执行直接操作。 不管是什么,它可以安全地说,把选逻辑视图通常在皱眉头。
我稍微觉得好笑,有些答案是绝对反对把排序在控制器或模型,我觉得他们太迂腐了我的口味,但我想这取决于所使用的框架的性质,并与相关的通常惯例它。 我也同意比尔·K公司的评论说,有摆在首位的分离是比较重要的。