【问题标题】:How does ASP.Net MVC differ from Classic ASP (not ASP.Net--the original ASP)ASP.Net MVC 与 Classic ASP(不是 ASP.Net——原始 ASP)有何不同
【发布时间】:2010-03-13 00:11:03
【问题描述】:

我正在尝试对 ASP.Net MVC 进行高级理解,我开始意识到它看起来很像原始的 ASP 脚本。过去,我们将“模型”/业务逻辑代码组织到 VBScript 类或 VB COM 组件中。

当然,现在我们有了 c# 和 .net 框架类的额外功能。除了 c# 和 .Net 中的高级 oo 和其他功能之外,原始 ASP 和 ASP.Net MVC 之间的其他主要区别是什么?

【问题讨论】:

    标签: asp.net asp.net-mvc asp-classic


    【解决方案1】:

    主要有三个区别:URL 映射、逻辑与表示的分离以及强类型。

    网址映射

    使用经典 ASP,可以从编写 HTML 页面平滑过渡到编写具有动态内容的 HTML 页面。与静态 HTML 文件一样,每个 URL 都直接映射到文件系统中的文件。对于 ASP.NET,同样的事情或多或少是真的,因为它的价值。

    在 ASP.NET MVC 中,URL 的每个“家族”都映射到一个控制器对象(默认情况下存储在 /Controllers 目录中),该家族的每个成员在访问时都会调用一个方法。在每个方法结束时(通常),你告诉它渲染一个特定的视图(存储在 /Views 目录中以控制器命名的文件夹中),这很像一个经典的 ASP 页面,所有逻辑都被分离出来.

    这为您提供了合乎逻辑且对 SEO 友好的 URL,并将相关功能组合在一起。

    逻辑与表示分离

    在经典的 ASP 中,通常会找到顶部包含一些 HTML 的页面,然后打开数据库连接,从数据库中读取一些内容,同时输出给用户,然后再输出一些 html,然后是另一个数据库语句,依此类推。

    在 ASP.NET MVC 中,您的业务逻辑(例如验证)进入模型层(您可以从几十种中选择一种,但流行的选择是 LINQ-to-SQL 和 LINQ-to-Entity-Framework),您的人机界面逻辑进入控制器(例如,根据国家/地区选择填充州/省菜单),并且您的演示文稿(您可以交给设计师编辑的实际 HTML)进入视图。

    除了保持事物井井有条之外,这还有助于为事物编写自动化测试。您可以将模拟对象发送到您的视图并确保它看起来不错,您可以将错误数据发送到您的模型并确保它抱怨,并且您可以确保您的控制器发送到您的视图的对象与它从模型中读取的内容。

    强类型化和编译

    ASP.NET 是强类型和编译的。这是一把双刃剑。一方面,它会在编译时捕捉到很多愚蠢的程序员错误。另一方面,这意味着您的代码中可能存在“无穷大减一”的错误(单元测试可以使其无穷大减去一些更大的数字)。此外,您还必须执行以下操作:

    if (MyArray.Length > 0)
    

    而不是

    if (MyArray.Length)
    

    但恕我直言,这是为您从强类型输入中获得的速度和健全性检查付出的小小代价。

    在大型框架中编译语言的更大缺点是,与经典 ASP 相比,部署变得更像是一种生产方式。您不能只将几个文件复制到 Web 服务器来更新您的应用程序。您通常必须关闭网络服务器(希望您有一个冗余对)并重新编译,这可能需要几分钟。

    【讨论】:

    • @Frank:我在上面被告知 VBScript 有类。如果是这样,那么是什么阻止了您在 Classic ASP 中将逻辑与表示分离?
    • 没什么。 MVC 只是更有力地鼓励最佳实践。虽然 Classic ASP 使用的 VBScript 有点像玩具语言,让你想把头发扯下来,但 C#(可能是 VBScript.NET)既令人愉快又非常强大。
    • 仍在尝试了解 URL 映射的主要价值和控制器的使用...还想确认不需要 ORM,只是一种方法,您仍然可以直接使用 ado .net,是吗?
    • @alchemical:是的,没错。您可以只使用 ADO.NET 而无需任何 ORM。
    • 关于逻辑和表示分离以及类的另一点——使用经典 ASP,我们还创建了封装业务逻辑的 COM 业务对象......所以我不确定这对ASP.Net MVC,虽然它肯定在总体上得到了改进。
    【解决方案2】:

    ASP.NET MVC 有很多管道基础设施:例如,路由引擎会自动调用正确的控制器和操作,并且可以从 URL 中提取位以作为操作参数传递;或基于约定的视图位置。它还为将数据从控制器传递到视图(ViewData 对象)提供了更多结构。

    此外,至关重要的是,MVC 支持视图引擎。您可以编写带有帮助程序的原始 HTML,但您也可以使用 Web 窗体、Spark、NHaml 等视图引擎,这些引擎允许您编写更简洁的视图代码、创建可重用组件(例如 Web 窗体控件)等。这在 ASP Classic 中是不可能的。

    【讨论】:

      【解决方案3】:

      经典 ASP 使用没有类的 VBScript。它根本不是面向对象的。

      【讨论】:

      • 其实可以在VBScript中创建简单的类:msdn.microsoft.com/en-us/library/4ah5852c%28VS.85%29.aspx
      • 在 VBScript 中也可以创建复杂的类,并且您可以使用默认属性来伪造继承。
      • 你可以用 javascript 做所有经典的事情,阅读 Crockford 看看这有多棒。
      • @LuftMensch: @svinto: ASP 3.0 支持哪个版本的 VBScript?那个版本有课程吗?我认为我从未见过它们在 ASP 页面中使用过。
      • 反对票最少,因为经典的 ASP 确实有类
      【解决方案4】:

      通常使用不同的技术,我们可以达到相同的效果 最后结果。 创建简单的站点几乎与技术的选择无关。 但是当你想让一个大型复杂的网站存在或不存在允许优化代码的框架时,保持良好的组织和有效的划分可能会发挥作用 至关重要并大大减少了工作量。

      ASP Classic 无法达到与 asp 相同的结果 网络 mvc。

      如果我们省略 c# vb 脚本之间的明显差异,我会说差异 主要是您可以更好地组织代码。

      与经典的 ASP 一样,很容易制作“意大利面条代码”,并且用 asp mvc,相反,它很容易保持一切整洁并分离代码 来自显示的业务逻辑。

      不仅如此。

      Asp Net Mvc 与 EntityFramework 等技术无缝集成 允许进一步分解和组织代码。

      【讨论】:

        猜你喜欢
        • 2010-12-17
        • 2013-01-22
        • 1970-01-01
        • 1970-01-01
        • 2011-05-05
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多