APS.Net MVC 浅谈[转] 来自MSDN

点击访问

MVC 理论结构

模型-视图-控制器 (MVC) 体系结构模式将应用程序分成三个主要组件:模型、视图和控制器。 ASP.NET MVC 框架提供用于创建 Web 应用程序的 ASP.NET Web 窗体模式的替代模式。 ASP.NET MVC 框架是一个可测试性非常高的轻型演示框架,(与基于 Web 窗体的应用程序一样)它集成了现有的 ASP.NET 功能,如母版页和基于成员资格的身份验证。 MVC 框架在 System.Web.Mvc 程序集中定义。

MVC 是许多开发人员熟悉的标准设计模式。 一些类型的 Web 应用程序将得益于 MVC 框架。 一些类型将继续使用基于 Web 窗体和回发的传统 ASP.NET 应用程序模式。 其他类型的 Web 应用程序将结合这两种方法;这两种方法彼此互不包含。 MVC 框架包括以下组件:

  • 模型。 模型对象是实现应用程序数据域逻辑的应用程序部件。 通常,模型对象会检索模型状态并将其存储在数据库中。 例如,Product 对象可能会从数据库中检索信息,操作该信息,然后将更新的信息写回到 SQL Server 数据库内的 Products 表中。 在小型应用程序中,模型通常是概念上的分离,而不是实际分离。 例如,如果应用程序仅读取数据集并将其发送到视图,则该应用程序没有物理模型层和关联的类。 在这种情况下,数据集担当模型对象的作用。

  • 视图。 视图是显示应用程序用户界面 (UI) 的组件。 通常,此 UI 是用模型数据创建的。

  • 控制器。 控制器是处理用户交互、使用模型并最终选择要呈现的视图来显示 UI 的组件。 在 MVC 应用程序中,视图仅显示信息;控制器则用于处理和响应用户输入和交互。 例如,控制器处理查询字符串值,并将这些值传递给模型,而模型可能会使用这些值来查询数据库。

MVC 模式可以帮助您创建使应用程序的不同方面(输入逻辑、业务逻辑和 UI 逻辑)分离的应用程序,同时可在这些元素之间提供松散耦合。 该模式指定每种逻辑在应用程序中应处的位置。 UI 逻辑位于视图中。 输入逻辑位于控制器中。 业务逻辑位于模型中。 在您生成应用程序时,通过使用这种分离方式,可以帮助您化繁为简,因为它可以使您侧重于一次实现应用程序的一个方面。 例如,您可以侧重于独立于业务逻辑的视图。

MVC 应用程序的这三个主要组件之间的松散耦合也可促进并行开发。 例如,一个开发人员可以从事视图方面的工作,第二个开发人员可以从事控制器逻辑方面的工作,第三个开发人员可以侧重于模型中的业务逻辑。

何时创建 MVC 应用程序

您必须仔细考虑是使用 ASP.NET MVC 框架还是使用 ASP.NET Web 窗体模型来实现 Web 应用程序。 MVC 框架未取代 Web 窗体模型;您可以对 Web 应用程序使用任一框架。 (如果您具有现有的基于 Web 窗体的应用程序,则这些应用程序将完全按照它们一贯的方式继续工作。)

在决定对特定网站使用 MVC 框架或 Web 窗体模型之前,请权衡各种方法的优点。

ASP.NET MVC 框架具有以下优点:

  • 通过将应用程序分为模型、视图和控制器,化繁为简的工作更加轻松。

  • 它不使用视图状态或基于服务器的窗体。 这使得 MVC 框架特别适合想要完全控制应用程序行为的开发人员。

  • 它使用一种通过单一控制器处理 Web 应用程序请求的前端控制器模式。 这使您可以设计一个支持丰富路由基础结构的应用程序。

  • 它为测试驱动的开发 (TDD) 提供了更好的支持。

  • 它非常适合大型开发人员团队支持的 Web 应用程序,以及需要对应用程序行为进行严格控制的 Web 设计人员。

基于 Web 窗体的框架具有以下优点:
  • 它支持通过 HTTP 保留状态的事件模型,这有益于开发业务线 Web 应用程序。 基于 Web 窗体的应用程序提供了在数百个服务器控件中受支持的许多事件。

  • 它使用页面控制器模式向单个页面添加功能。

  • 它针对基于服务器的窗体使用视图状态,这使得管理状态信息更加轻松。

  • 它非常适合想要利用大量组件快速开发应用程序的 Web 开发人员和设计人员的小型团队。

  • 通常,对于应用程序开发而言,它比较简单,这是因为组件(Page 类、控件等)紧密集成并且通常需要比 MVC 模型更少的代码

  • 应用程序任务(输入逻辑、业务逻辑和 UI 逻辑)的分离、可测试性和测试驱动的开发 (TDD)。 MVC 框架中的所有核心协定都基于接口并且可使用 mock 对象进行测试,mock 对象是模仿应用程序中实际对象的行为的模拟对象。 您可以对应用程序进行单元测试,而不必在 ASP.NET 进程中运行控制器,这使得单元测试既快速又灵活。 您可以使用任何与 .NET Framework 兼容的单元测试框架。

  • 可扩展且可插入的框架。 设计 ASP.NET MVC 框架组件的目的是为了可以轻松地替换或自定义它们。 您可以插入自己的视图引擎、URL 路由策略、操作方法参数序列化以及其他组件。 ASP.NET MVC 框架还支持使用依赖项注入 (DI) 和控制反转 (IOC) 容器模型。 DI 使您能够将对象注入到类中,而不是依靠类来创建对象本身。 IOC 指定某个对象是否需要其他对象,第一个对象应该从配置文件之类的外部源中获取第二个对象。 这样,测试会更加轻松。

  • 广泛支持 ASP.NET 路由,ASP.NET 路由是一个功能强大的 URL 映射组件,它允许您生成具有易于理解的可搜索 URL 的应用程序。 URL 未必包含文件扩展名,并且旨在支持非常适合搜索引擎优化 (SEO) 和具象状态传输 (REST) 寻址的 URL 命名模式。

  • 支持将现有 ASP.NET 页面(.aspx 文件)、用户控件(.ascx 文件)和母版页(.master 文件)标记文件中的标记用作视图模板。 您可以将诸如嵌套母版页、内联表达式 (<%= %>)、声明性服务器控件、模板、数据绑定、本地化等现有 ASP.NET 功能与 ASP.NET MVC 框架结合使用。

  • 支持现有 ASP.NET 功能。 ASP.NET MVC 允许您使用一些功能,如 Forms 身份验证和 Windows 身份验证、URL 授权、成员资格和角色、输出和数据缓存、会话和配置文件状态管理、运行状况监视、配置系统以及提供程序体系结构。

MVC 框架和应用程序结构

URL 路由

ASP.NET MVC 框架将使用 ASP.NET 路由引擎,通过该引擎可以灵活地将 URL 映射到 controller 类。 您可以定义 ASP.NET MVC 框架使用的路由规则,以评估传入的 URL 以及选择相应的控制器。 您还可以让该路由引擎自动分析 URL 中定义的变量,并让 ASP.NET MVC 框架将值作为参数自变量传递给控制器。

MVC 框架和回发

ASP.NET MVC 框架不使用 ASP.NET Web 窗体回发模型与服务器交互, 而是会将所有最终用户交互路由到 controller 类。 这样可使 UI 逻辑与业务逻辑保持分开并有助于提高可测试性。 因此,ASP.NET 视图状态和 ASP.NET Web 窗体页面生命周期事件不会与基于 MVC 的视图集成。

Web 应用程序 MVC 项目结构

默认情况下项目结构如下

  • App_Data,这是数据的物理存储区。 此文件夹的作用与它在使用 Web 窗体页面的 ASP.NET 网站中的作用相同。大多数情况下其实并不用这个文件夹放置数据库 , 一般项目还是应该把数据库服务器和web服务器分开, 在web.config中配置连接节点连接外部的数据库.

  • Apps: 通常我们把web项目中引用的公用类放在这里 ,比如用户密码加密,分页控件代码,用户登录信息保存等等…

  • Controllers: 这个文件夹主要存放XML文件,系统需要用到的XML信息文件等.

  • Content,建议在此位置添加内容文件,如级联样式表文件、图像等。 通常,Content 文件夹用于存储静态文件。小型项目可以在此文件夹存储用户数据文件 , 更多的应该把用户文件排除在项目之外.

  • Controllers,建议在此位置存储控制器。 MVC 框架要求所有控制器的名称均以“Controller”结尾.比如HomeControllers 此处的Controllers结尾不可删除,要不然路由就无法识别控制器了.

  • Models,这是为表示 MVC Web 应用程序的应用程序模型的类提供的文件夹。 此文件夹通常包括定义对象以及定义与数据存储交互所用的逻辑的代码。 通常,实际模型对象将位于单独的类库中。 但是,在创建新应用程序时,您可以将类放在此处,然后在开发周期中稍后的某个时刻将其移动到单独的类库中。比如利用三层架构的时候Models文件夹里面的东西其实就是Domain层里面的实体.

  • Scripts,建议在此位置存储支持应用程序的脚本文件。 默认情况下,此文件夹包含 ASP.NET AJAX 基础文件和 jQuery 库。

  • Views,建议在此位置存储视图。 视图使用 ViewPage (.aspx)、ViewUserControl (.ascx) 和 ViewMasterPage (.master) 文件,以及与呈现视图相关的任何其他文件。 在 Views 文件夹中,每个控制器都具有一个文件夹;该文件夹以控制器名称前缀命名。 例如,如果控制器名为 HomeController,则 Views 文件夹包含名为 Home 的文件夹。 默认情况下,当 ASP.NET MVC 框架加载视图时,它将在 Views\控制器名称 文件夹中寻找具有请求的视图名称的 ViewPage (.aspx) 文件。 默认情况下,Views 文件夹中也有一个名为 Shared 的文件夹,但该文件夹不与任何控制器相对应。 Shared 文件夹用于存储在多个控制器之间共享的视图。 例如,您可以将 Web 应用程序的母版页放在 Shared 文件夹中。

    在MVC3加入了 Razor视图引擎后.视图的后缀为.cshtml,相对以前的aspx要灵活很多,也没有很多可以可以拖动的控件,ASP.Net MVC 框架设计之初就是为了让开发者更深入的设计web应用程序,所以很多方面都需要自己编写啦…

  • Global.asax文件: 文件中的代码来设置全局 URL 路由默认值 在MVC3中这个文件中还可以放置站点加载时初始化的一些方法.

  • web.config文件: 此文件是一个XML文件, 里面存放着站点的基本配置信息,比如连接数据库节点,站点加载的相关参数等等.

ASP.NET MVC掉过的坑_MVC初识及MVC应用程序结构的更多相关文章

  1. ASP.NET MVC 5 03 - 安装MVC5并创建第一个应用程序

    不知不觉 又逢年底, 穷的钞票 所剩无几. 朋友圈里 各种装逼, 抹抹眼泪 MVC 继续走起.. 本系列纯属学习笔记,如果哪里有错误或遗漏的地方,希望大家高调指出,当然,我肯定不会低调改正的.(开个小 ...

  2. 在ASP.NET非MVC环境中(WebForm中)构造MVC的URL参数

    目前项目中有个需求,需要在WebForm中去构造MVC的URL信息,这里写了一个帮助类可以在ASP.NET非MVC环境中(WebForm中)构造MVC的URL信息,主要就是借助当前Http上下文去构造 ...

  3. ASP.NET MVC 学习1、新增Controller,了解MVC运行机制

    1,turorial ,根据链接教程新建一个MVC项目 http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/ ...

  4. 在ASP.NET非MVC环境中(WebForm中)构造MVC的URL参数,以及如何根据URL解析出匹配到MVC路由的Controller和Action

    目前项目中有个需求,需要在WebForm中去构造MVC的URL信息,这里写了一个帮助类可以在ASP.NET非MVC环境中(WebForm中)构造MVC的URL信息,主要就是借助当前Http上下文去构造 ...

  5. ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 03. 服务注册和管道

    ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 03. 服务注册和管道 语雀: https://www.yuque.com/yuejiangliu/dotnet/ ...

  6. ASP.NET MVC教程二:ASP.NET MVC应用程序结构详解

    在上一篇文章中,讲解了一些MVC的概念,并且创建了第一个ASP.NET MVC项目,这篇文章将讲解ASP.NET MVC程序中的代码解构,新创建的MVC应用程序解构如下图所示: 一.App_Data ...

  7. ASP.NET Web 应用 Docker踩坑历程——续

    ASP.NET Web 应用 Docker踩坑历程发表后,也开始使用Docker了,然而发布的过程比较痛苦,经常发生下图的事情: 据说是nuget包还原时发生错误 百度了半天也找不到解决的方法,而发生 ...

  8. Asp.net MVC学习--默认程序结构、工作流程

    二.MVC 默认程序结构 MVC新建好之后,会对应的出现几个包,分别是:Controller.Model.View --即MVC 其中的默认的Default.aspx文件可以方便url重写,如果不设置 ...

  9. MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)

    前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...

随机推荐

  1. MongoDB 1: NoSQL 和 SQL的区别

    导读:本篇博客,主要是结合自己在项目中的使用,简单的阐述一下NoSQL和SQL的区别.那么,根据自己的应用,NoSQL这边,选择的是MongoDB(Redis虽然也是,但属于内存存储,这里不予说明). ...

  2. web关键词搜索高亮代码

    <script type="text/javascript"> /* * 参数说明: * obj: 对象, 要进行高亮显示的html标签节点. * hlWords: 字 ...

  3. Mysql group by 排序问题

    类如 有一个 帖子的回复表,posts( id , tid , subject , message , dateline ) , id 为 自动增长字段, tid为该回复的主题帖子的id(外键关联), ...

  4. 凡聊过必留下痕迹-破解加密的WeChat数据库

    有个朋友上门寻求协助,带着她朋友的朋友的手机,说是手机硬件有问题,想把手机内的资料都备份出来,尤其是WeChat的聊天内容…我跟她说,那iTool等工具不就可以帮上忙了吗?没想到她早就试过了, 说iT ...

  5. ORA-00031: session marked for kill 处理Oracle中杀不掉的锁

    一些ORACLE中的进程被杀掉后,状态被置为"killed",但是锁定的资源很长时间不释放,有时实在没办法,只好重启数据库.现在提供一种方法解决这种问题,那就是在ORACLE中杀不 ...

  6. JavaScript字符串转日期格式

    var dependedVal="2005-3-4"; //根据日期字符串转换成日期 var regEx = new RegExp("\\-","gi ...

  7. Android IOS WebRTC 音视频开发总结(十二)-- sufaceview

    谈到音视频不得不谈谈对视频呈现的理解,为了让大家能有一个更好的理解,先看看android里面SurfaceView的原理,后续陆续分享其绘画原理. 说明:本文是转载的,转载自哪里我也不知道,貌似经过很 ...

  8. 很不错的安卓FadingActionBar控件源码

    这个我刚刚从一个github下载过来的,自己测试一下运行了,感觉还不错的,安卓FadingActionBar控件源码,现在就给大家分享一下,源码我已经上传到源码天堂那里了,想下载的朋友可以去那里下载吧 ...

  9. Android数据库(sqlite)加密方案

    最近因为一些项目的安全性需要将数据库加密,一开始想到的就是先将数据库通过AES加密,然后运行时再解密,另一种是将数据库里的内容加密. 很快这两种方案都是不理想的,第一种加密方式形同虚设,第二种,如果加 ...

  10. 【风马一族_php】PHP与Mysql建立连接

    让php发出 Hi作为基础 http://www.cnblogs.com/sows/p/5990157.html 配置apache      ../apache/conf/httpd.conf 创建p ...