【问题标题】:What Is ASP.Net MVC?什么是 ASP.Net MVC?
【发布时间】:2010-09-10 11:11:39
【问题描述】:

当我第一次听说 StackOverflow,听说它是用 ASP.Net MVC 构建的时候,我有点困惑。我认为 ASP.Net 一直是 MVC 架构的一个例子。您拥有提供视图的 .aspx 页面、提供控制器的 .aspx.vb 页面,并且您可以创建另一个类作为模型。在Microsoft article中描述了在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 服务器控件)模型。我只很少使用它,从未在工作中使用过。

【问题讨论】:

    标签: asp.net-mvc model-view-controller


    【解决方案1】:

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

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

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

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

    【讨论】:

    • Leon,可以对控制器进行单元测试 - 查看 Scott Guthrie 的这篇文章。 weblogs.asp.net/scottgu/archive/2007/11/13/…我相信API在最近的beta版本中有所改变,但原则是合理的。 (秘密极客粉丝,顺便说一句)
    • 噢! - 刚刚阅读下一篇文章并意识到其他人知道 ASP MVC 的测试潜力
    【解决方案2】:

    Scott Guthrie 在这篇文章“ASP.NET MVC Framework”中解释了这一点

    • 它通过以下方式实现关注点、可测试性和 TDD 的清晰分离 默认。内的所有核心合同 MVC 框架是基于接口的 并且易于模拟(它包括 基于接口 IHttpRequest/IHttpResponse 内在函数)。您可以对 应用程序而无需运行 ASP.NET 进程中的控制器 (使单元测试快速)。你可以 使用你的任何单元测试框架 想做这个测试(包括 NUnit、MBUnit、MS 测试等)。

    • 它具有高度的可扩展性和可插拔性。 MVC 中的所有内容 框架的设计使其可以 易于更换/定制(用于 示例:您可以选择插件 您自己的视图引擎、路由策略、 参数序列化等)。它 还支持使用现有的 依赖注入和 IOC 容器 模型(温莎,Spring.Net, NHibernate 等)。

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

              【解决方案7】:

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-05-09
                • 2011-04-13
                • 2019-06-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多