WebForms vs MVC

WebForms vs MVC

  本文地址:WebForms vs MVC 余文 翻译 原文地址

简介

我做ASP.NET已经有很长一段时间了,而我也很享受用web forms 开发网页程序。 

微软在2008年推出了一种叫做 ASP.NET MVC 的技术,当时的我对于“为什么需要另一种 ASP.NET 技术”C 这个事情相当的困惑。而很多人现在依然在想这个问题。

很多人说ASP.NET MVC 是用来替换ASP.NET Web Forms的。但这不是事实。这两种技术各有长短,没有谁能简单的告诉或者教会我们什么时候该用什么。但是我们可以讨论一些可以帮助我们在两种技术中间做出选择的客观因素。而这篇文章就包括一些这样的客观因素。

我们同时也尝试解答以下问题。,
  • 什么是 ASP.NET?
  • 什么是 ASP.NET Web Forms?
  • 什么是 MVC?
  • 什么是 ASP.NET MVC?

如果你是一个已经非常熟悉ASP.NET MVC的高级的或者经验丰富的ASP.NET MVC开发者,那么这篇文章将帮助你修正你的某些看法。

索引

可视化开发

微软最初提出了可视化开发的概念。在Visual Basic,Visual C++之类的技术的帮助下,图形用户程序的快速开发成为可能。拖拽和智能感应之类的功能使程序员能将更多的精力投入到程序的业务逻辑中而不是UI 设计中。
但是这种技术起初只能在桌面程序开发中使用,当开发web 程序时,微软只提供了ASP技术。

Web技术

当我们说web技术的时候,我们有经典ASP,php,jsp,ROR,ASP.NET Web Forms,ASP.NET MVC 以及其他很多技术。经典ASP 是微软推出的web 技术之一。经典ASP 的最让人头疼的是一团乱麻一样的代码和糟糕的可维护性。让我们假设这样一个场景,你有一些text box 和一个button,当你点击button的时候你在server端验证数据,如果数据合法,那么数据被存入数据库。如果数据不合法,那么错误信息将以红色label的形式展示给用户。你知道这个场景中最大的问题是什么吗?你不得不自己处理很多东西。

  1. 首先通过设置form的action属性值指向自身以实现回传。
  2. 当button点击的时候text box 的值将被清空,所以只能从回传的数据中重新获得值。
  3. 考虑到验证失败,你必须实现 
    1. 从回传数据中取出所有text box 对应的值再赋给它。
    2. 显示错误信息。

(使用Ajax 是一种可选的方法。这里这样做只是想解释使用经典ASP所需要做大手动工作)

Web的可视化开发

Visual Basic之类的技术只限于做独立的程序,在web方面,微软当时给出的唯一选项就是ASP。

当我们讨论Web和桌面的时候,我们需要考虑两个问题

  1. 状态管理怎样工作?
  2. request/response怎样工作?

Web工作依赖的HTTP协议是一个无状态的协议。我们发出的request 和收到的response都是独立于前面的request和response的。它不像桌面程序那样有可以保存的变量和复杂的事件驱动模型。它像桌面程序一样等待用户输入,但是用户的每一次输入和交互对server都是一次全新的request(get/post)。

最终微软提出了ASP.NET Web Forms,一种已经优先考虑了快速开发和简单易学的技术。

什么是 ASP.NET?

ASP.NET是微软的Web程序框架,它建立在标准语言运行时上,用于开发动态网站,使用C#,VB.NET之类的语言进行开发。它支持两种模式,Web Forms和ASP.NET MVC。

什么是 Web Forms?

在ASP技术之后微软推出了ASP.NET Web Forms,它通过对无状态的web进行高层次的抽象和模拟状态模型为Web开发人员解决了很多问题。在web forms引入了 postback(将数据传给同一个页面)和ViewState(在postbacks时管理控件状态)之类的概念。而最令人关注的是它不需要写一行代码。通过Web Forms微软尝试将Visual Basic 模式引入到web中。

让我们讨论一下Web Forms的优点和缺点吧。

优点:

  • 支持服务器控件

        当你用纯HTML工作时你可能已经注意到,代码并不是在所有浏览器里都显示的一样。

        一个在IE里显示得很棒的UI可能在Firefox显示的不如人意,反之亦然。

      ASP.NET服务器控件检测浏览器然后生成合适的html和需要用到的JavaScript。
  • 很多服务器控件比如GridView和ListView拥有数据绑定能力,这能使需要做的工作和需要写的代码大大减少。
  • 对ViewState的支持 - 你应该已经听过很多次”HTTP是一个无状态的协议“这样的话了。通常情况下控件不会在多次请求中保持它们的值。但是在Web Forms状态保持这个功能已经通过在client页面中以隐藏的称为ViewState的区块的形式保存每个控件的最近状态的方式实现了。
  • 事件驱动开发 -


    有赖以下技术
    • Code behind(代码后置)
    • Self postbac机制(自动数据回发)(将form传回同一个页面)
    • ViewState
    微软将事件驱动开发引入了internet世界。

    开发者不再需要依赖POST,GET方法来处理用户和服务的交互。比如,他拖动一个叫button的控件拖动到页面中,只需要双击一下就会生成用于在服务端处理用户点击的代码块,之后在里面写下逻辑代码就好了。这就成了,他不需要关注里面怎么实现的。

  • 快速开发 - 不需要多的解释,服务器控件,事件驱动模型和ViewState大大加快了开发速度,开发者从大量的后台复杂性中解脱了出来。
  • Less learning effort. - Using strong server controls and ViewState developer can develop real world applications with minimal HTML and JavaScript skills.

缺点:

  • 项目架构

    当使用Web Forms开发web程序时没有固定的项目架构,开发者有充分的灵活来选择他们自己的架构。
    有些人可能选择基本的三层架构将系统分成表现层(UI),业务逻辑层(BLL)和数据访问层(DAL)或者更先进的比如MVP(Model-View-Presenter)架构。甚至有些人可能选择只使用code behind技术,将所有的代码都写在那里,当然这并不被认为是一种好的实践。Code behind 紧紧的和UI联系在一起,最终实现一些显示的逻辑。

  • Unit Testing

    在Web Forms的code behind技术中使用了很多事件处理,这使自动单元测试成为了不可能的任务。
    另: 就我所知,就算有mock测试(使用MOQ或者rhinomoq)我们也不能模拟eventhandlers中的‘Sender‘和‘eventargs‘。
     
    而我们要使用TDD(测试驱动开发)时,对后台代码(显示逻辑)进行单元测试变得很非常的重要。

  • 性能

    ViewState是经典ASp中一些问题的解决方案,但它同时是一个问题。ViewState存储在页面本身中导致页面变大以致影响性能。

  • Reusability

    让我们讨论一下另一个期望我们实现两个UI的例子吧。
    • 需纳税的员工页面 
    • 不需纳税的员工页面
    现在两个页面的大部分的后台逻辑将是相同的。
    一种解决方案是,在后台代码中添加一些if条件判断而只创建一个UI页面。
    • 这将违反单一职责原则,即程序实体改变的原因只能有一个。而在这种情况下员工的表单将在需纳税或不需纳税信息改变的时候都改变。
  • 对HTML缺少控制 - 在Web Forms中很多时候我们不确定我们最终将得到怎样的html,这使得和jQuery之类的JavaScript框架交互成为了一个困难的任务。
  • SEO(搜索引擎优化)

     
    URL 指向特定的ASPX页面,还可能附加了一些查询字符串。这对用户不友好并且不利于搜索引擎优化。 

  • 对并行开发支持不佳- ASPX 页面和后台文件紧紧结合在一起,这使得两个程序员不可能工作在同一部分(一个开发页面,一个开发后台代码)。

ASP.NET 4.0

ASP.NET 4.0 发布了一些新功能来解决一些上面提到的问题

  • ViewState: 提供了关闭或者控制ViewState大小的方法。(但是没有强制或者确切的规定要求这样做)。
  • URL 路由:使用URL路由我们可以提供我们自己的URL来代替页面的物理路径。
  • ID: 在ASP.NET4.0中我们可以通过元素的Id得到对html更好的控制,因此和JavaScript框架的交互变得简单了些。(我们仍然对生成的HTML没有完全的控制.)

即使在ASP.NET革命性的功能演进之后,

  1. 它仍然没有解决单元测试的问题
  2. 我从来没有看到任何一个ASP.NET Web Form开发者曾尝试将ViewState 禁止掉。   (个人观点,不喜勿喷)。
  3. 我们通过元素的Id获得了一些控制,但不是完全控制。在实现JavaScript时仍然有问题。

什么是 MVC?

MVC是一个已经被广泛使用的架构模式
包括Java在内的很多语言使用它。它不是微软提出的新观念。接下来我们将要讨论ASP.NET MVC。但在此之前让我们先搞清楚一些包括MVC在内的概念。

  • 模式 - 简单的说的模式是某种背景下的问题的解决方案。
  • 架构模式- 架构模式是用来在子系统级别或者模块级别上解决问题的。它处理和项目架构有关的问题。它告诉我们怎么分离我们的系统并且告诉我们为什么。我们创建类库,组件,服务来解决问题。
  • MVC 当我们讨论到程序时,我们将有输入逻辑,业务逻辑和UI逻辑,而MVC是一个能让我们开发的程序的各个模块松散耦合的架构模式。
    TMVC架构模式的主要目的是分离关系,它使显示或者UI同业务逻辑和用户交互逻辑分离。
    依据MVC,系统应该被分为M(模型),V(视图)和C(控制)。
  • Model is considered as smart and handles the Business rules, logic and data and will be independent of other parts of MVC (controller and View).
  • Controller receives and dispatches the request in short it handles the user interaction and input logic. It knows about both Model and View.
  • A view is considered as dumb and is an output representation of model data. It may be an excel sheet, a web page showing list of records or just a simple text. View knows about only Model.  

什么是 ASP.NET MVC?

ASP.NET MVC 是微软的另一个Web程序框架,它设计时及以考虑到代码分离和可测试性。它建立在CLR之上并且完全基于MVC架构。因此我们考虑问题是要从视图和控制器的角度思考。ASP.NET MVC不支持VIewState和服务器控件。因此我们有开发老式web程序的感觉。让我们讨论一下ASP.NET MVC的优点和缺点吧。

优点:

    • 项目架构 -
      使用ASP.NET MVC 的一个好处是它强制分离联系,因此基本不会把结构搞的复杂。
    • 测试驱动开发和可重用性
      • 在MVC中控制是一个可以实现自动测试的单独的类,这对测试驱动开发意义重大。
      • 控制没有绑定到任何特殊的试图因此可以被多个视图使用。
           
    • 性能 - ASP.NET MVC不需要支持视图状态,因此没有任何自动状态管理,这可以减少页面大小,提高性能。
    • 对HTML的全面控制- 在ASP.NET MVC中层次之间是松耦合,因此能够一些开发者在工作在控制层,一些开发者工作在试图层,同时另一些开发者工作在模型层 。这就是并行开发。
    • 支持并行开发- 在ASP.NET MVC中层次之间是松耦合,因此能够一些开发者在工作在控制层,一些开发者工作在试图层,同时另一些开发者工作在模型层 。这就是并行开发。
    • SEO,URL路由和REST - 强大的路由功能使我们能把每个URL视为一个支持RESTful接口的资源。

同时对用户友好和可读的URL有利于SEO。

  • 可扩展性 - ASP.NET MVC 支持多个视图引擎,比如aspx,razor并且如果有需要的话我们可以创建我们自己的引擎。
  • 现有ASP.NET功能– ASP.NET MVC框架创建在现在有的成熟的ASP.NET框架之上。因此提供给开发者使用许多好的功能。比如表单验证,windows验证,缓存,session和profile 状态管理等等。li>

缺点:

  • 更高的学习成本 -没有事件驱动模型和ViewState使 ASP.NET MVC对没有太多web程序开发经验的开发者是一个非常难学的框架。

ASP.NET MVC 怎样工作

  1. 用户发出对服务器资源的请求(通过在浏览器里输入一些URL)
  2. 请求先来到controller(路由引擎负责决定哪个请求该被哪个controller处理。本文不深入讨论这个行为)。
  3. 如果有需要的话controller和model交互数据
  4. Model访问数据库(或者其他数据源)然后返回数据(以业务对象的形式)给controller。
  5. controller选择对应的view(比如说Customer view 可能包含一些html 表格,下拉列表,文本框等)。
  6. controller将数据(在上面第4步中mode返回的l数据)返回给选定的view(在第5步)中以合适的样式显示出来。
  7. controller将view返回给用户。

上面说的是get请求的过程,对post而言也一样。只是用户触发请求的方法是在已经获得的页面上作一些操作,比如点击button,改变下拉框的值等,而不是在浏览器中输入一个URL。

ASP.NET Web Forms 和 ASP.NET MVC,选哪个?

对于一个特定的程序来说,哪一个都可以是最好的选择,这要看程序的要求和参与项目的成员的背景。什么时候选择哪一个更多的是看业务预期而不是哪个比哪个好。当面临SP.NET Web Forms 和ASP.NET MVC的选择时,知道没有哪个技术是用来代替另一个技术这一点很重要 当作出选择时,以下两个因素需要考虑到

Two important factors you should consider while making the choice is
  1. 快速开发-如果你想要快速开发那么 ASP.NET Web Forms 是你唯一的选择,对于快速开发,ASP.NET MVC你连想都不用想(因为使用快速开发的原因可能是客户给钱不多,或者程序只是用一两个月不需要太多维护)。
  2. 单元测试-如果自动单元测试对你是最重要的事,那么MVC是最合适的。

除此之外,你可以写下你的项目的所有需求然后将它们和Web Forms 和MVC的优缺点比较。如果可以的话试着问你下面这些问题然后据此决定选择哪一个。

  1. 你的团队有Web Forms 或者Windows Form 的经验吗?如果有的话,那么对团队来说学习MVC将是一个无趣的任务,因为程序员已经习惯ViewState和事件驱动开发,迁移是一个艰难的任务。Web Forms 加一分。
  2. 你的团队有ASP.NET MVC经验吗?有的话ASP.NET MVC加一分。
    If yes ASP.NET MVC get 1 point 
  3. 你的团队有ASP或者非微软技术经验吗?比如说android,ios,JSP,ROR,PHP。 如果你之前曾经是JSP或者PHP开发者那么你应该对于HTTP的get和set很熟悉,甚至你可能曾经写过MVC因为它们大多默认使用MVC。这给ASP.NET MVC.加一分。
  4. 项目会大量使用JavaScript吗?如果是,那么MVC加一分,因为在MVC你可以获得对HTML完全的控制。
  5. 期待良好的性能?
    没有对ViewState的支持,ASP.NET MVC相对于传统的ASP.NET Web Forms提供更好的性能。ASP.NET MVC加一分。
  6. 计划重用输入逻辑?
    如果是的话继续给MVC加一分。

Conclusion

我想你应该已经获得了足够的信息来决定哪一个对你的项目更好,决定依赖于你的团队和项目需求。

希望大家喜欢这篇文章,感谢耐心读完。

许可

本文以及相关源代码及文件,在 The Code Project Open License (CPOL)许可下。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。