与Web窗体相比,MVC同时是用于HTML生成的较低级方法,可以更好地控制页面输出,并且是较高级,更受体系结构驱动的方法。让我记录一下Web Forms和MVC,并说明为什么我认为在很多情况下,这种比较偏爱Web Forms的原因-只要您不属于某些经典的Web Forms陷阱。
网络表格
在Web窗体模型中,您的页面直接对应于浏览器的页面请求。因此,如果将用户定向到“书籍”列表,则可能会将页面定向到“ Booklist.aspx”。在该页面中,您必须提供显示该列表所需的一切。这包括用于提取数据,应用任何业务逻辑以及显示结果的代码。如果有任何架构或路由逻辑影响页面,则还必须在页面上编写架构逻辑。 良好的 Web窗体开发通常涉及在单独的(可单元测试的)DLL中开发一组支持类。这些类将处理业务逻辑,数据访问和体系结构/路由决策。
MVC
MVC对Web应用程序开发采取了更为“架构性”的观点:提供了构建标准框架。它还提供了用于在已建立的体系结构内自动生成模型,视图和控制器类的工具。例如,在Ruby on Rails(从这里开始只是“ Rails”)和ASP.NET MVC中,您总是从反映其Web应用程序体系结构总体模型的目录结构开始。要添加视图,模型和控制器,您将使用类似Rails的“ Rails脚本/生成脚手架{modelname}”的命令(ASP.NET MVC在IDE中提供了类似的命令)。在生成的控制器类中,将存在索引(显示列表),显示,新建以及编辑和销毁(至少在Rails中,MVC相似)的方法(“动作”)。默认情况下,这些“
目录和文件的布局在MVC中很重要。例如,在ASP.NET MVC中,“ Book”对象的Index方法可能只有一行:“ Return View();”。通过MVC的魔力,这会将Book模型发送到“ /View/Books/Index.aspx”页面,您将在其中找到显示Books的代码。Rails的方法与此类似,尽管逻辑更加明确,“魔术”也少了。MVC应用程序中的“ 视图”页面通常比“ Web表单”页面简单,因为它们不必担心路由,业务逻辑或数据处理。
比较方式
MVC的优点围绕着清晰的关注点分离和更清洁,更HTML / CSS / AJAX /以Javascript为中心的模型来生成输出。这增强了可测试性,提供了更加标准化的设计,并为更多“ Web 2.0”类型的网站打开了大门。
但是,也有一些明显的缺点。
首先,虽然很容易获得演示站点,但总体架构模型具有重要的学习曲线。当他们说“ Convention over Configuration”时,这听起来不错-直到您意识到自己有一本书值得学习的惯例。此外,弄清楚正在发生的事情通常有点令人发疯,因为您是依靠魔术而不是显式调用。例如,“ Return View();” 在上面打电话吗?可以在其他操作中找到完全相同的调用,但是它们转到不同的位置。如果您了解MVC约定那么您知道为什么这样做。但是,它肯定不适合作为良好命名或易于理解的代码的示例,对于新开发人员而言,比起Web Forms而言,学习起来要困难得多(这不仅是一种观点:我去年夏天在暑期实习,学习Web Forms。和今年的MVC,生产力方面的差异也很明显-支持Web表单)。顺便说一句,尽管Ruby on Rails具有动态命名的方法,但在某些方面也需要认真使用,但Rails在这方面要好一些。
其次,MVC隐式假定您正在构建经典的CRUD风格的网站。架构决策,尤其是代码生成器,都是为了支持这种类型的Web应用程序而构建的。如果您正在构建CRUD应用程序并且想要采用经过验证的体系结构(或者只是不喜欢体系结构设计),那么您可能应该考虑使用MVC。但是,如果您要做的不只是CRUD,而且/或者您有足够的体系结构能力,那么在您真正掌握基础路由模型之前,MVC可能会像直升飞机一样(这比在WebForms应用程序中简单地路由要复杂得多)。即使那样,我仍然觉得自己一直在与模型争执,并担心意外的结果。
第三,如果您不关心Linq(要么是因为您担心Linq-to-SQL会消失,要么是因为您发现Linq-to-Entities可笑地过度生产且功能不足),那么您也不想因为ASP.NET MVC脚手架工具是围绕Linq构建的(因此对我来说是杀手),所以走了这条路。与您有SQL经验(尤其是精通TSQL和存储过程!)相比,Rails的数据模型也很笨拙。
第四,MVC支持者经常指出,MVC视图在本质上更接近于Web的HTML / CSS / AJAX模型。例如,“ HTML帮助程序”(在您的vew页面中的小代码调用可交换内容并将其放入HTML控件中)与Javascript集成要比Web Forms控件容易得多。但是,ASP.NET 4.0引入了命名控件的功能,因此在很大程度上消除了这一优势。
第五,MVC的纯粹主义者经常嘲笑Viewstate。在某些情况下,他们这样做是正确的。但是,Viewstate还是一个很好的工具,并且可以提高生产力。相比之下,处理Viewstate 比尝试将第三方Web控件集成到MVC应用程序中要容易得多。虽然控件集成对于MVC来说可能会变得更加容易,但是我目前看到的所有努力都需要构建(有点令人讨厌)代码,以将这些控件链接回视图的Controller类(即- 围绕 MVC模型工作) )。
结论
我从许多方面喜欢MVC开发(尽管从长远来看,我更喜欢Rails而不是ASP.NET MVC)。我还认为,重要的是,不要陷入认为ASP.NET MVC是ASP.NET Web窗体的“反模式”的陷阱。他们是不同的,但并非完全陌生,当然两者都有空间。
但是,我更喜欢Web Forms开发,因为对于大多数任务而言,完成工作更简单(例外是生成一组CRUD表单)。MVC似乎在某种程度上还受制于过多的理论。 确实,看看那些了解面向页面的ASP.NET但正在尝试MVC的人在SO上在这里问的许多问题。无一例外,开发人员发现他们无法完成基本任务,除非跳过箍圈或承受巨大的学习曲线,无一例外。这就是使Web Forms在我的书中优于MVC的原因:MVC使您付出现实的代价,以获取更多的可测试性,或者更糟糕的是,由于您使用的是Web表单而被视为很酷。最新技术。
更新:我在评论部分受到了严厉的批评-其中有些很公平。因此,我花了几个月的时间来学习Rails和ASP.NET MVC,以确保我不会真正错过下一件大事!当然,这也有助于确保我对问题做出平衡而适当的回答。您应该知道上面的回复是我最初回答的主要重写,以防评论看起来不同步。
当我更仔细地研究MVC时,我想了一会儿,我最终会遇到一个主要的问题。最后,我得出的结论是,尽管我认为我们需要在Web Forms架构和可测试性上花费更多的精力,但MVC确实无法满足我的要求。因此,向那些对我的最初回答提出明智批评的人们表示衷心的“谢谢”。
对于那些认为这是一场宗教斗争并无情地设计下注洪水的人,我不明白您为什么要打扰(多次在几秒钟内在20多个下票肯定是不正常的)。如果您正在阅读此答案,并且想知道分数是否远低于其他答案,那么我的答案是否确实存在“错误”,请放心,它说的是一些不同意的人,而不是一般意义上的社区(总的来说,这个社区已被投票100多次)。
事实是,许多开发人员并不关心MVC,实际上,这并不是少数观点(即使在博客中似乎也表明了在MS中)。