04 入门 - ASP.NET MVC应用程序的结构
用Visual Studio创建了一个新的ASP.NET MVC应用程序后,将自动向这个项目中添加一些文件和目录。
如图所示:

用Internet Application模板创建ASP.NET MVC项目后有8个顶级目录。
如图所示:

如果不喜欢这个目录结构,怎么办?
ASP.NET MVC并不是非要这个结构。
事实上,那些处理大型引用程序的开发人员通常跨多个项目来今个应用程序,以便使该应用程序更易于管理。
(例如,数据模型的实体类常常位于一个来自单独的类库项目中)。
然而,默认的项目结构确实提供了一个很好的默认目录约定,使得系统的关注点变得明确、清晰。
当进行扩展时,请注意关于这些文件或文件夹的以下内容:
1. /Controllers目录
展开这个文件夹,将会发现Visual Studio默认向里面添加了默认的Controller类。
如图所示:

2. /Views目录
展开这个文件夹,将会发现3个子目录(/Home、/Account和/Shared)以及其中的一个模板文件。
这些子目录也是默认添加到当前项目中的,如图所示:

3. /Content和/Scripts目录
展开这个目录,将会发现几个CSS文件(用于调整站点上所有HTML文件的样式)以及Javascript库(可以启用应用程序中的jQuery支持)。
如图所示:

4. /BookStore.Test项目
展开这个项目,将会发现一个类,其中包含所有对应于HomeController类的单元测试。
如图所示:

这些由Visual Studio天际的默认文件提供了一个可以运行的应用程序的基本结构。
完整地包括了首页、关于页面、账户登录/退出/注册页面以及一个未经处理的错误页面(所有页面彼此联系起来,可以直接使用)。
一、SP.NET MVC的约定
默认情况下,ASP.NET MVC应用程序对约定的依赖性很强。
这样就避免了开发人员配置和指定一些项,因为这些项可以根据约定来推断。
例如,当解析视图模板时,ASP.NET MVC采用一种基于约定的目录命名结构。
这个约定可以实现当从Controller类中引用视图引擎时,省略位置路径信息。
默认情况下,ASP.NET MVC会从应用程序下的\Views\[ControllerName]\目录中查找视图模板文件。
设计ASP.NET MVC是围绕着一些基于约定的默认项,这些默认项在需要的时候可以被覆盖。这个概念通常称为“约定优于配置”。
二、约定优于配置
在Ruby on Rails上约定优于配置的概念流行开来,它的本质意义在于:到目前为止,您已经知道如何创建Web应用程序,现在将以以前积累的经验应用于框架中,以后开发就没必要再配置每一项。
通过查看应用程序运行的三个核心目录,可以在ASP.NET MVC中看到这一概念:
1. Controllers
2. Models
3. Views
没必要在web.config文件中设置这些文件夹名称 —— 他们约定在配置文件中。
这样就避免了编辑XML文件(如web.config)的工作。
例如,为了显示地告诉MVC引擎“可以在Views目录中查找程序视图” —— 这些程序都已经知道,这就是约定。
这不是魔术,但实际上又是,但是它又不是那种黑魔术(结果出人意料的,甚至伤害到自己的魔术)。
ASP.NET MVC的约定非常容易理解,下面是预期的程序结构:
1. 每个Controller类的名字以Controller结尾,例如ProductController、HomeController等,这些类在/Controllers目录中。
2. 应用程序的所有视图放在一个单独的Views目录下。
3. 控制器使用的视图是在Views主目录的一个子目录中,这个子目录是根据控制器名称(后面减去Controller的后缀)来命名的。
例如“HomeController”使用的视图就放在“/Views/Home”中。
所有可重用的UI元素都位于一个相似的结构中,而不是全部都直接存在Views文件夹里面。
相关的内容会在后面操作视图的时候回着重介绍。
三、定简化通信
编写代码进行通信主要面向两个不同的方面:
1. 需要将清晰的无二义性的指令传递给计算机,让它去执行。
2. 需要让开发人员读懂你的代码,以便后期系统的维护、调试以及完善。
前面已经讨论了约定优于配置如何高效地将开发者的想法意图传达给MVC。
约定也能帮助开发者清晰地和其他开发人员(或者以后的自己)进行交流。
不必详细地描述如何构建应用程序的每一个方方面面,按照共同的约定可以是世界上所有的ASP.NET MVC开发人员公用一个公共的标准。
通常,软件设计模式的优势之一是他们建立了一种标准语言。
由于ASP.NET MVC采用了MVC模式以及一些独特的定义,这让ASP.NET MVC开发者能够轻松地理解不是自己编写的代码或以前编写但是现在忘记了的代码,即便在大型的系统中也是这样。
想象一下,国家不同,语言不通,肤色不同,但是写的代码都是按照默认约定走的,你是不是也能看懂了?哈哈。
04 入门 - ASP.NET MVC应用程序的结构的更多相关文章
- ASP.NET MVC应用程序展示RDLC报表
原文:ASP.NET MVC应用程序展示RDLC报表 学习ASP.NET MVC这样久,在学习,练习与应用过程中,觉得很多知识与以前的ASP.NET多有区别,但是实现操作起来,细处又有许多相近的地方. ...
- [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序创建更复杂的数据模型
这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第六篇:为ASP.NET MVC应用程序 ...
- [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序读取相关数据
这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第七篇:为ASP.NET MVC应用程序 ...
- [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序更新相关数据
这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第八篇:为ASP.NET MVC应用程序 ...
- [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序使用异步及存储过程
这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第九篇:为ASP.NET MVC应用程序 ...
- [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序处理并发
这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第十篇:为ASP.NET MVC应用程序 ...
- [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序实现继承
这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第十一篇:为ASP.NET MVC应用程 ...
- 详解ASP.NET MVC应用程序请求生命周期
------转载当一个ASP.NET MVC应用程序提出请求,为了响应请求,包含一些请求执行流程步骤! 在ASP.NET MVC应用程序Http request 和Http response 过程中, ...
- NHibernate构建一个ASP.NET MVC应用程序
NHibernate构建一个ASP.NET MVC应用程序 什么是Nhibernate? NHibernate是一个面向.NET环境的对象/关系数据库映射工具.对象/关系数据库映射(object/re ...
随机推荐
- es6学习笔记-async函数
1 前情摘要 前段时间时间进行项目开发,需求安排不是很合理,导致一直高强度的加班工作,这一个月不是常说的996,简直是936,还好熬过来了.在此期间不是刚学会了es6的promise,在项目有用到pr ...
- traefik 结合 docker-compose 的快速安装及使用
traefik 介绍 traefik 是一个为了让部署微服务更加便捷而诞生的现代HTTP反向代理.负载均衡工具. 它支持多种后台 (Docker, Swarm, Kubernetes, Maratho ...
- Java 泛型完全解读
对于泛型的使用我想大家都非常熟悉,但是对于类型擦除,边界拓展等细节问题,可能不是很清楚,所以本文会重点讲解一下:另外对泛型的了解其实可以看出,一个语言特性的产生逻辑,这对我们平时的开发也是非常有帮助的 ...
- 简述Java中的final关键字
final关键字可用于修饰类.方法和变量,final修饰的类不能被继承:final修饰的方法不可被重写:final修饰的变量不可被改变. 1. final类 final修饰的类不能被继承意思是fina ...
- 【普及篇】通信能力API及其前景分析
** 1.目前通信行业发展背景**运营商基础通信能力的价值逐渐提升进入数字化时代以来,信息产业正迎来新变革与新发展——网络信息技术与社会各领域全面深度融合,为工业制造.智慧城市等各行业赋能.运营商传统 ...
- 数据库 【redis】 命令大全
以下纯属搬砖,我用Python抓取的redis命令列表页内容 如果想看命令的具体使用可查去官网查看,以下整理为个人查找方便而已 地理位置GEOADD 将指定的地理空间位置(纬度.经度.名称)添加到指定 ...
- [AI开发]基于深度学习的视频多目标跟踪实现
据我目前了解掌握,多目标跟踪大概有两种方式: Option1 基于初始化帧的跟踪,在视频第一帧中选择你的目标,之后交给跟踪算法去实现目标的跟踪.这种方式基本上只能跟踪你第一帧选中的目标,如果后续帧中出 ...
- 搭建属于自己的GIT服务器——pingg
1.下载并安装jdk. 下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htm ...
- mpvue小程序开发之 城市定位
背景: 在进行小程序开发时,有一个定位城市的需求,下面就来讲讲怎么实现这个功能的吧 解决方案: 小程序的wx.getLocation()获得是经纬度并不包含地名,所以要通过经纬度用相应的地图转换出地名 ...
- vs 2017 vs code
vs 2017 Enterprise: NJVYC-BMHX2-G77MM-4XJMR-6Q8QF Professional: KBJFW-NXHK6-W4WJM-CRMQB-G3CDH ==== ...