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

一、App_Data

App_Data目录用于存储想要读取或写入的数据文件。

二、App_Start

App_Start文件夹目录如下图所示:

顾名思义:该目录用于保存一些功能的配置代码,例如路由、捆绑和过滤器等。

三、Content

Content文件夹目录如下:

该文件夹用于存放资源文件,例如CSS、图像和其他站点内容,而非脚本。

四、Controllers

Controllers文件夹目录结构如下:

该目录用于保存那些处理URL请求的Controller类。按照约定,项目中所有的Controller文件都放在该文件夹里面。

五、font

font文件夹目录结构如下:

该目录用于保存Bootstrap模板系统包含的一些自定义Web字体。

六、Models

该目录用于保存那些表示和操纵数据以及业务对象的实体类。

七、Scripts

Scripts文件夹目录结构如下:

该目录用于保存项目中所有的JavaScript库文件和脚本(.js)文件。

八、Views

Views文件夹目录结构如下:

该文件夹用于保存项目中的所有视图文件。包括以控制器名称命名的文件夹。按照约定:视图的名称和控制器里面的Action方法的名称必须一致,否则程序会报错。如下图所示:

从上面的截图中能够看出:视图的名称和控制器里面Action方法的名称一一对应。下面把About视图的名称改成About1,然后在访问About视图,看看是什么效果:

这是因为程序找不到名为About的视图,所以报错了。这就说明视图名称必须和Action方法名称一一对应。

在Views文件夹下面还有一个Shared文件夹,该文件夹目录如下:

该文件夹里面的视图相当于模板视图,任何控制器下面找不到的视图都会去Shared文件夹下面找相应的视图。_Layout.cshtml就是一个全局视图,用于整个项目的整体布局,后面会讲到该视图。

在上面的例子中,把About视图的名称改成了About1,现在在Shared文件夹下面创建一个About视图,然后在访问HomeController里面的About方法,看看这时程序显示的效果:

这时程序就不会报错了,因为Home文件夹下面没有名为About的视图,所以程序会去Shared文件夹下面查找名为About的视图。

九、Web.config

看下面的截图:

从上面截图中可以看出:项目中存在两个Web.config文件,一个位于项目的根目录中,另外一个Views文件夹下面,那么这两个Web.config文件有什么作用呢?

1、根目录下面的Web.config文件

根目录下面的Web.config文件是系统的配置文件,用于配置数据库连接字符串等。

2、Views文件夹下面的Web.config

看视图中的一段代码:

  1. @{
  2. Layout = null;
  3. }
  4.  
  5. <!DOCTYPE html>
  6.  
  7. <html>
  8. <head>
  9. <meta name="viewport" content="width=device-width" />
  10. <title>CustomerAction</title>
  11. </head>
  12. <body>
  13. <div>
  14. <h1>当前登录用户:@base.ViewData["UserId"]</h1>
  15. </div>
  16. </body>
  17. </html>

在上面一段代码中,有一句:@base.ViewData["UserId"],这里有一个base,base表示父类,F12查看定义:

  1. #region 程序集 System.Web.Mvc, Version=5.2.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
  2. // D:\Practice\MVC\Demo\ASPNETMVCDemo\packages\Microsoft.AspNet.Mvc.5.2.7\lib\net45\System.Web.Mvc.dll
  3. #endregion
  4.  
  5. namespace System.Web.Mvc
  6. {
  7. //
  8. // 摘要:
  9. // 表示呈现使用 ASP.NET Razor 语法的视图所需的属性和方法。
  10. //
  11. // 类型参数:
  12. // TModel:
  13. // 视图数据模型的类型。
  14. public abstract class WebViewPage<TModel> : WebViewPage
  15. {
  16. //
  17. // 摘要:
  18. // 初始化 System.Web.Mvc.WebViewPage`1 类的新实例。
  19. protected WebViewPage();
  20.  
  21. //
  22. // 摘要:
  23. // 获取或设置 System.Web.Mvc.AjaxHelper 对象,该对象用于使用 Ajax 呈现 HTML 标记。
  24. //
  25. // 返回结果:
  26. // 用于使用 AJAX 呈现 HTML 标记的 System.Web.Mvc.AjaxHelper 对象。
  27. public AjaxHelper<TModel> Ajax { get; set; }
  28. //
  29. // 摘要:
  30. // 获取或设置 System.Web.Mvc.HtmlHelper 对象,该对象用于呈现 HTML 元素。
  31. //
  32. // 返回结果:
  33. // 用于呈现 HTML 元素的 System.Web.Mvc.HtmlHelper 对象。
  34. public HtmlHelper<TModel> Html { get; set; }
  35. //
  36. // 摘要:
  37. // 获取关联的 System.Web.Mvc.ViewDataDictionary 对象的 Model 属性。
  38. //
  39. // 返回结果:
  40. // 关联的 System.Web.Mvc.ViewDataDictionary 对象的 Model 属性。
  41. public TModel Model { get; }
  42. //
  43. // 摘要:
  44. // 获取或设置一个字典,其中包含在控制器和视图之间传递的数据。
  45. //
  46. // 返回结果:
  47. // 一个字典,其中包含在控制器和视图之间传递的数据。
  48. public ViewDataDictionary<TModel> ViewData { get; set; }
  49.  
  50. //
  51. // 摘要:
  52. // 初始化 System.Web.Mvc.AjaxHelper、System.Web.Mvc.HtmlHelper 和 System.Web.Mvc.UrlHelper
  53. // 类。
  54. public override void InitHelpers();
  55. //
  56. // 摘要:
  57. // 设置视图数据。
  58. //
  59. // 参数:
  60. // viewData:
  61. // 视图数据。
  62. protected override void SetViewData(ViewDataDictionary viewData);
  63. }
  64. }

这说明视图里面的cshtml代码有一个父类:WebViewPage。那么WebViewPage是如何来的呢,看视图下面的Web.config文件:

十、Global.asax

下面看看Global.asax文件代码:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6. using System.Web.Optimization;
  7. using System.Web.Routing;
  8.  
  9. namespace ASPNETMVCDemo
  10. {
  11. public class MvcApplication : System.Web.HttpApplication
  12. {
  13. protected void Application_Start()
  14. {
  15. // 注册所有区域路由
  16. AreaRegistration.RegisterAllAreas();
  17. // 注册过滤器
  18. FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
  19. // 注册路由
  20. RouteConfig.RegisterRoutes(RouteTable.Routes);
  21. // 绑定
  22. BundleConfig.RegisterBundles(BundleTable.Bundles);
  23. }
  24. }
  25. }

程序启动的时候会首先执行Global.asax里面的Application_Start()方法,该方法只在程序启动的时候执行一次,完成初始化工作。修改代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6. using System.Web.Optimization;
  7. using System.Web.Routing;
  8. using System.IO;
  9.  
  10. namespace ASPNETMVCDemo
  11. {
  12. public class MvcApplication : System.Web.HttpApplication
  13. {
  14. protected void Application_Start()
  15. {
  16. string strFilePath = @"C:\LogInfo.txt";
  17. using (StreamWriter sw = new StreamWriter(strFilePath))
  18. {
  19. sw.WriteLine("网站启动");
  20. sw.Close();
  21. }
  22.  
  23. // 注册所有区域路由
  24. AreaRegistration.RegisterAllAreas();
  25. // 注册过滤器
  26. FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
  27. // 注册路由
  28. RouteConfig.RegisterRoutes(RouteTable.Routes);
  29. // 绑定
  30. BundleConfig.RegisterBundles(BundleTable.Bundles);
  31. }
  32. }
  33. }

运行程序,查看日志:

ASP.NET MVC教程二:ASP.NET MVC应用程序结构详解的更多相关文章

  1. 【译】ASP.NET MVC 5 教程 - 7:Edit方法和Edit视图详解

    原文:[译]ASP.NET MVC 5 教程 - 7:Edit方法和Edit视图详解 在本节中,我们继续研究生成的Edit方法和视图.但在研究之前,我们先将 release date 弄得好看一点.打 ...

  2. 【ASP.NET实战教程】ASP.NET实战教程大集合,各种项目实战集合

    [ASP.NET实战教程]ASP.NET实战教程大集合,各种项目实战集合,希望大家可以好好学习教程中,有的比较老了,但是一直很经典!!!!论坛中很多小伙伴说.net没有实战教程学习,所以小编连夜搜集整 ...

  3. 2017.3.31 spring mvc教程(八) <mvc:annotation-driven />所做的工作

    学习的博客:http://elf8848.iteye.com/blog/875830/ 我项目中所用的版本:4.2.0.博客的时间比较早,11年的,学习的是Spring3 MVC.不知道版本上有没有变 ...

  4. ASP.NET Core的配置(2):配置模型详解

    在上面一章我们以实例演示的方式介绍了几种读取配置的几种方式,其中涉及到三个重要的对象,它们分别是承载结构化配置信息的Configuration,提供原始配置源数据的ConfigurationProvi ...

  5. [js高手之路]深入浅出webpack教程系列3-配置文件webpack.config.js详解(下)

    本文继续接着上文,继续写下webpack.config.js的其他配置用法. 一.把两个文件打包成一个,entry怎么配置? 在上文中的webpack.dev.config.js中,用数组配置entr ...

  6. Ocelot简易教程(三)之主要特性及路由详解

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9664977.html 上篇<Ocelot简易教程(二)之快速开始2>教大家如何快速跑起来一个 ...

  7. Linux Shell系列教程之(八)Shell printf命令详解

    本文是Linux Shell系列教程的第(八)篇,更多shell教程请看:Linux Shell系列教程 在上一篇:Linux Shell系列教程之(七)Shell输出这篇文章中,已经对Shell p ...

  8. 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高

    第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...

  9. Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验

    Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高 ...

随机推荐

  1. hdu 6318 Swaps and Inversions (线段树求逆序对数)

    Swaps and Inversions Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  2. 数据库day01

    作业: 1. 查看岗位是teacher的员工姓名.年龄 select name,age from staff_info where jobs = 'teacher'; 查看岗位是teacher且年龄大 ...

  3. PyTorch-网络的创建,预训练模型的加载

    本文是PyTorch使用过程中的的一些总结,有以下内容: 构建网络模型的方法 网络层的遍历 各层参数的遍历 模型的保存与加载 从预训练模型为网络参数赋值 主要涉及到以下函数的使用 add_module ...

  4. Android 音视频技术之录音获取实时音量

    一.实时音量相关基础知识 说到获取音量,大家首先想到的应该就是分贝(dB),分贝是一个相对单位(是一个比值,是一个数值,是一个纯计数方法). 在音频领域dB度量的是声音的强度,其计算的公式如下: 在上 ...

  5. .Net Core 项目发布到Linux - CentOS 7(二)用Supervisor守护netcore进程

    简介 supervisor可以保证程序崩溃后,可以重新把程序启动起来等相关功能. 安装 yum install -y supervisor 安装好后在/etc/会生成一个supervisord.con ...

  6. springboot(二):bootstrap和application有什么区别?

    “SpringBoot专注于快速方便的开发单个个体微服务. SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来, 为各个服务之间提供 ...

  7. C#中的Skip()和Take()

    Skip()和Take()方法都是IEnumerable<T> 接口的扩展方法,包括C#中的所有Collections类,如ArrayList,Queue,Stack等等,还有数组和字符串 ...

  8. 关于python中的增量赋值的理解

    增量赋值运算符 += 和 *= 的表现取决于它们的第一个操作对象 += 操作首先会尝试调用对象的 __ iadd__方法,如果没有该方法,那么尝试调用__add__方法,所以+= 与 + 的区别实质是 ...

  9. nltk的安装和简单使用

    使用python进行自然语言处理,有一些第三方库供大家使用: ·NLTK(Python自然语言工具包)用于诸如标记化.词形还原.词干化.解析.POS标注等任务.该库具有几乎所有NLP任务的工具. ·S ...

  10. 熔断器Hystrix及服务监控Dashboard

    服务雪崩效应 当一个请求依赖多个服务的时候: 正常情况下的访问 : 但是,当请求的服务中出现无法访问.异常.超时等问题时(图中的I),那么用户的请求将会被阻塞. 如果多个用户的请求中,都存在无法访问的 ...