什么是ASP.Net MVC?

15
当我第一次听说StackOverflow并听说它是用ASP.Net MVC构建的时,我有点困惑。我认为ASP.Net总是MVC架构的一个例子。您有提供视图的.aspx页面,提供控制器的.aspx.vb页面,并可以创建另一个类作为模型。在ASP.Net中使用MVC的过程在此Microsoft article中描述。
所以我的问题是,ASP.Net MVC提供了什么,您无法使用常规ASP.Net(即使是到ASP.Net 1.1)做到这一点?只是花哨的URL?这只是为了炫耀MS也能将自己与像Ruby On Rails这样的新技术进行比较,并说“我们也可以做到”吗?除了文件->新菜单中的一些额外模板之外,ASP.Net MVC实际上还提供了更多东西吗?
我现在可能听起来非常怀疑和消极,所以我会停止。但我真的想知道ASP.Net MVC实际提供了什么。此外,如果有人告诉我为什么它是Model-View-Controller而不是按View-Controller-Model或Model-Control-View层的顺序,具体取决于您是从上到下还是从下到上,我也会非常感激。
编辑
另外,值得指出的是,我从未真正关心过Web表单(也称为服务器控件)模型。我只使用过它的最小限度,并且从未在工作中使用过。
7个回答

14

.aspx 页面不符合MVC模式,因为aspx页面(视图)在代码后端(控制器)之前被调用。

这意味着控制器对视图有“硬依赖”,这非常违反了MVC原则。

MVC的一个核心优点是允许你测试你的控制器(其中包含大量逻辑),而不必实例化真正的视图。在.aspx世界中,你根本无法做到这一点。

仅测试控制器要比实例化整个asp.net管道(应用程序、请求、响应、视图状态、会话状态等)快得多。


Leon,控制器的单元测试是可能的 - 可以查看Scott Guthrie的这篇文章。http://weblogs.asp.net/scottgu/archive/2007/11/13/asp-net-mvc-framework-part-1.aspx 我相信在最近的beta版本中API已经发生了变化,但原则是正确的。(顺便说一句,我是个秘密的极客粉丝) - belugabob
糟糕!刚刚看了下一篇帖子,意识到其他人也意识到了 ASP MVC 的测试潜力。 - belugabob

7

Scott Guthrie在这篇文章 "ASP.NET MVC Framework"中解释了它的作用:

  • 它通过默认的方式实现了关注点分离、可测试性和TDD。MVC框架内的所有核心合同都是基于接口的,易于模拟(包括基于接口的IHttpRequest/IHttpResponse内在机制)。您可以在不运行控制器在ASP.NET进程中的情况下对应用程序进行单元测试(使单元测试变得更快)。您可以使用任何单元测试框架来执行此测试(包括NUnit、MBUnit、MS Test等)。

  • 它非常灵活且可插拔。MVC框架中的所有内容都被设计为可以轻松替换/自定义(例如:您可以选择插入自己的视图引擎、路由策略、参数序列化等)。它还支持使用现有的依赖注入和IOC容器模型(Windsor、Spring.Net、NHibernate等)。

  • 它包含一个非常强大的URL映射组件,使您能够构建具有干净URL的应用程序。URL不需要在其中包含扩展名,并且被设计为轻松支持SEO和REST友好的命名模式。例如,我可以轻松地将/ products / edit / 4 URL映射到上面我的项目中ProductsController类的“Edit”操作,或将/Blogs/scottgu/10-10-2007/SomeTopic/ URL映射到BlogEngineController类的“DisplayPost”操作。

  • MVC框架支持使用现有的ASP.NET .ASPX、.ASCX和.Master标记文件作为“视图模板”(这意味着您可以轻松使用现有的ASP.NET功能,如嵌套主页、<%= %>片段、声明性服务器控件、模板、数据绑定、本地化等)。但是,它不使用现有的后台模型与MVC基础视图进行交互。相反,您将所有最终用户交互路由到一个控制器类中,从而有助于确保关注点分离和可测试性(这也意味着MVC基础视图没有viewstate或页面生命周期)。

  • ASP.NET MVC框架完全支持现有的ASP.NET功能,如表单/ Windows身份验证、URL授权、成员资格/角色、输出和数据缓存、会话/配置文件状态管理、健康监测、配置系统、提供程序体系结构等。


1
主要来说,它使得创建可测试的网站和明确定义的职责分离变得非常容易。使用新的MVC框架也更容易创建有效的XHTML用户界面。
我已经使用第二个CTP(我想现在他们已经发布了五个版本)开始开发一个网站,并且之前我也创建过一些Web应用程序,我不得不说它比使用服务器控件模型好了数百倍。
当你不知道该怎么做时,服务器控件是可以的。但是,当你开始学习关于Web应用程序如何运作时,你开始与它们抗争。最终,你必须编写自己的控件以克服当前控件的缺陷。这就是MVC开始发挥作用的时候。更别提您的网站可测试性了...

1
没有更多的自动生成的HTML ID了!!!任何做javascript的人都会赞赏这一点。

0

ASP.Net的代码后台几乎是MVC,但不完全是。使其不是MVC的一个重要因素是代码后台直接绑定到aspx文件上,而这是MVC的一个重要组成部分。如果您将代码后台视为控制器,则应该将其与视图完全解耦。新的.NET MVC框架完善了这一点,并带来了完整的MVC框架。虽然已经存在针对.NET的现有框架(请参见Spring.NET)。


0

我看了一些简单的例子,比如this one。我有点看出它们之间的区别。然而,我并不真正明白MVC是如何将视图与控制器解耦的。视图仍然引用控制器中的内容。我确实看到它使测试变得更容易,至少在MVC中,控制器不知道视图的任何信息。你也不需要处理视图来调用控制器中的方法。我可以看出这是一个很大的进步,即使乍一看可能不像什么。

我同意@Will关于与服务器控件作斗争的观点。我从未在使用它们的情况下工作过,但我认识的许多人都遇到了很多限制。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接