在我工作的地方,我们有一个用.NET3.5编写的项目作为webforms项目。它是分层的;表示层,逻辑层和数据。
我们有这些每周一次的技术会议'工作中。我做了关于MVC的演讲。
我的技术负责人决定进入,并告诉我上面的项目(分层,webforms)与MVC相同。他接着描述了以下内容:
长话短说 - 关于上述项目(分层网格形式)是否构成MVC,我们陷入了一场悬而未决的争论。
有人可以提供并回答这场辩论吗?
由于
答案 0 :(得分:2)
没有。 mvc主要用于强烈关注分离。除了模型的传递(或不传递)之外,控制器和视图没有绑在一起并且不了解另一个。单个控制器可用于呈现许多视图,其中后面的aspx代码与单个aspx页面紧密相关,因为它们都是同一个分类的一部分。模型差异较小,除了在大多数mvc应用程序中,模型不是实际的域数据类型,而是一些可用于渲染视图的组合。
与mvc不同的另一件事是严格的层次结构文件夹结构和命名约定。这促进了最佳实践,并再次促进了关注的分离。
microsoft创建了asp.net mvc框架是有原因的,虽然你可以使用路由等模仿网页表单中mvc的一些感觉,但它不会也不会完全相同。
同样,虽然这已经倾向于asp.net mvc,但显然还有很多其他的风格。我建议您查看FubuMVC。
答案 1 :(得分:1)
由于a pattern MVC与任何特定技术(WebForms,WinForms,ASP.NET MVC等)无关。
因此很有可能在WebForms中实际执行MVC。
CodeBehind文件可以被视为控制器,但从技术上讲它是不正确的:文件后面的代码和aspx文件都只编译成一种类型(因为它们是部分类),所以在这个问题上没有控制器类型和视图类型;) 但我们可能会认为这种差异很小。
WebForms可以被视为实现MVC模式的东西,承认它是一个非常难看的实现,很容易搞砸。但是一旦它搞砸了(因为它经常发生),View和Controller之间的分离关注的整个想法至少被违反了,所以一旦这种分离模糊或消失,我们就应该说它不再是MVC了。
简历:WebForms可以被视为MVC模式的一个实现,但是在这个实现中很难遵循这种模式,所以它很少是MVC并且仍然在其概念中。
答案 2 :(得分:1)
坦率地说,技术领先是错误的。
之前从未使用过真正的MVC框架的人之间存在一种常见的误解,即“MVC”只是一种不同的网络形式,实际上,没有什么可以离真相更远。
要理解为什么会出现这种情况,您需要了解MVC(体系结构模式)和ASP.NET MVC之间的区别,这是由microsoft构建的实现MVC模式的框架。
通常情况下,技术主管和架构师等人不太了解该主题,将使用术语“MVC”来描述模式和框架没有理解两者之间的差异,这往往会导致混淆。
因此,要明确的是,MVC模式并不是什么新鲜事,它实际上是由许多框架实现的,例如:
Webforms 不是开箱即用的实现MVC模式的框架之一。
现在确实可以在WebForms中实现MVC模式,但Webforms更适合实现MVP样式模式,实际上有一个框架(such as this one)可以帮助你这方面。
技术主管不知道他在说什么的最大指标是:
我的技术负责人决定进入,并告诉我上面的项目 (分层,webforms)与MVC相同
在您的应用程序中引入“层”与MVC无关。实际上,在分层体系结构中,MVC应用程序完全位于表示层中,与其他应用程序层无关。
使用ASP.NET MVC作为前端意味着您的表示层位于使用ASP.NET MVC框架实现的逻辑层之上。这并不意味着您突然因为使用MVC而突然删除了对其他层的需求。
相反,Webforms只是分层体系结构中的表示层。仅仅因为你使用分层架构并不意味着你正在使用MVC模式。
对于其他每一点:
视图只是ASPX页面 这不是真的。 ASPX页面是非常复杂的野兽,在MVC视图之间有一个非常重要的区别:
它们旨在维护状态
他们拥有页面生命周期的整个系统以及旨在维持回发之间状态的视图状态和控件。
ASP.NET MVC被设计为无状态,因此,视图不包含这样的复杂性。
控制器只是页面支持
这句话完全忽略了控制者的观点。
Codebehinds明确知道与呈现ASPX页面的过程有关的所有内容。它了解页面上的控件,页面状态,页面的生命周期以及与视图的 紧密耦合 。
代码隐藏也只会返回1件事。一个aspx页面。
控制器更灵活,不仅可以返回视图,还可以用于 控制 逻辑,以呈现数据的不同表示形式。例如,您可能希望将相同的数据呈现为标准http请求的HTML,或者呈现为AJAX请求的JSON。
这是可能的,因为控制器逻辑和视图逻辑 松散耦合 ,这使得这成为可能。
模型只是数据对象
这是错误的。在您将数据对象直接绑定到视图的任何类型的复杂性的任何类型的MVC应用程序中都很少见。简而言之,数据在数据库中建模的方式很少代表显示视图所需的数据。
例如,假设您有一个员工记录,其中包含“TitleId”。记录中的数据只是一个int,但是你需要向用户显示一个实际的文本值才能使它有意义。
因此,在大多数MVC应用程序中,您的“模型”实际上会更准确地描述为“ViewModel”,并且与您的数据或域模型完全分开。
总结
你的技术主管是错误的,而不仅仅是语义层面的错误,而是“你没有想法 - 你在谈论什么”这个层面的错误。
希望有所帮助。