15

当我第一次听说 StackOverflow,听说它是用 ASP.Net MVC 构建的时候,我有点困惑。我认为 ASP.Net 一直是 MVC 架构的一个例子。您拥有提供视图的 .aspx 页面、提供控制器的 .aspx.vb 页面,并且您可以创建另一个类作为模型。在Microsoft 这篇文章中描述了在 ASP.Net 中使用 MVC 的过程。

所以我的问题是。ASP.Net MVC 提供了哪些常规 ASP.Net(甚至早在 ASP.Net 1.1)无法提供的功能?它只是花哨的 URL?MS 能够将自己与 Ruby On Rails 等新技术进行比较,并说“我们也可以做到”,这仅仅是为了吹嘘自己的权利吗?ASP.Net MVC 是否提供了更多内容,而不是 File->New 菜单中的几个额外模板?

我现在可能听起来很怀疑和消极,所以我会停下来。但我真的很想知道 ASP.Net MVC 实际提供了什么。另外,如果有人能告诉我为什么它是 Model-View-Controller 而不是按照 View-Controller-Model 或 Model-Control-View 层的顺序,这取决于你是从上到下,反之亦然,我会真的很感激。

编辑

此外,可能值得指出的是,我也从未真正关心过 Web 表单(AKA 服务器控件)模型。我只很少使用它,从未在工作中使用过。

4

7 回答 7

14

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

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

MVC 的核心优势之一是它允许您在不实例化真实视图的情况下测试控制器(其中包含大量逻辑)。在 .aspx 世界中,您根本无法做到这一点。

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

于 2008-09-17T23:56:12.090 回答
7

Scott Guthrie 在这篇文章“ ASP.NET MVC 框架”中解释了它

  • 默认情况下,它可以清晰地分离关注点、可测试性和 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 类的“编辑”操作,或者将 /Blogs/scottgu/10-10-2007/SomeTopic/ URL 映射到“ BlogEngineController 类的 DisplayPost" 操作。

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

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

于 2008-09-18T09:43:30.570 回答
1

首先,它使得创建具有明确定义的职责分离的可测试网站变得非常容易。使用新的 MVC 框架创建有效的 XHTML UI 也容易得多。

我已经使用第二个 CTP(我认为他们现在是五个)开始在网站上工作,并且之前创建了一些 Web 应用程序,我不得不说它比使用服务器控制模型好数百倍。

当您不知道自己在做什么时,服务器控件很好。当您开始了解 Web 应用程序应该如何运行时,您就开始与它们作斗争。最终,您必须编写自己的代码来克服当前控件的缺点。正是在这一点上,MVC 开始大放异彩。这甚至没有考虑您网站的可测试性......

于 2008-09-17T23:58:02.613 回答
1

不再有自动生成的 html ID!任何做任何类型的 javascript 的人都会欣赏这个事实。

于 2008-09-18T00:12:43.220 回答
0

ASP.Net 与它的代码背后几乎是MVC - 但不是 - 一个重要的事情是代码隐藏直接绑定到 aspx 的 - 这是 MVC 的一个重要组成部分。如果您将代码隐藏视为控制器 - 应该与视图完全分离。新的 .NET MVC 完善了这一点 - 并带来了一个完整的 MVC 框架。虽然已经有 .NET 的现有版本(请参阅 Spring.NET)。

于 2008-09-17T23:54:18.317 回答
0

我浏览了几个简单的例子,比如这个。我可以看出区别。但是,我并没有真正看到 MVC 如何将视图与控制器分离。该视图仍然引用控制器中的内容。我确实看到了它如何使测试变得更加容易,并且至少在 MVC 中,控制器对视图一无所知。而且您不必处理视图来调用控制器中的方法。我可以看到这是一个相当大的飞跃,尽管乍一看它可能看起来并不多。

我同意@Will 关于对抗服务器控制的看法。我从来没有在实际使用过它们的情况下工作过,但是我认识的很多人都遇到了很多限制。

于 2008-09-18T00:10:40.417 回答
0

关于 ASP.net MVC 与 ASP.net Web 表单的文章

http://weblogs.asp.net/shijuvarghese/archive/2008/07/09/asp-net-mvc-vs-asp-net-web-form.aspx

于 2008-09-18T09:36:29.633 回答