MVC系列1-MVC基础 (ASP.NET)

终于决定写一个系列的文章了,最开始实际上是准备写一下WPF的,由于我这两年一直在作WPF,对WPF的喜好天然是无以言表。可是因为我所在的地区对WPF的普及不是很普遍,因此,被迫又开始作起来web,可是我又不想在传统的web froms上工做。固而开始研究MVC。在看完了一本入门级的MVC书籍以后,我又转而开始爱上MVC。它轻量,简洁,扩展性和对html的深度控制这些特性会打破ASP.NET的开发模式。可是,也不是说MVC就能解决一切问题。它就是全部的编程模式中最好的,它也会有它的一些不足。但是咱们想一想,世界上有什么东西又会是完美的呢?对于咱们程序员而言,语言,IDE就是咱们工具。只要用着顺手,能写出高效的代码就好了。管它谁人说那种语言好仍是很差呢。废话说得有点多,我更新这个系列的文章是为了对本身学习的一个总结,而且分享给尚在学习阶段的兄弟。在园子里写得比我好的大牛不少。因此,欢迎指正错误与不足。html

  既然这是介绍MVC,那咱们就来讲说什么是MVC。传统的MVC实际上是一种理念。旨在分离关注点。及把咱们的系统按照不一样的关注点分离开来。这样系统以各自的关注点分离开来。整个系统的可维护性,扩展性都会大大的提升。整个系统的层次结构也会更加的清晰。咱们这里所谈的MVC实际上是ASP.NET MVC。ASP.NET MVC实际上是一种框架。以ASP.NET为平台的框架,也就是说,其实它其实仍是运行在ASP.NET运行时上的,微软根据MVC的理念,在ASP.NET上封装了一套遵循了MVC理念的框架。咱们的程序在理论上大部分的时候是在处理数据,而数据的处理方式是遵循特定行业的特定业务逻辑。以界面来展现数据。那么至少从这里咱们能够抽象出一下几个关注点程序员

  •   界面
  •   界面逻辑
  •   业务逻辑
  •   数据

  在这个时刻,咱们至少是能够总结出以上的关注点,遵循分离关注点的原则,咱们至少要把这些关注点给分离开来。

  在这里,咱们是把数据和业务逻辑放在了一块儿。由于从领域编程的角度,数据也好,业务逻辑也好。他们都是属于某些特定领域的。好比金融领域,航空领域。因此这里他们是能够放在一块儿的,其中还会包括一些其余的,好比验证,属性标注等等。web

  咱们看上面的一张图能够看到。关注点被分离。MVC的全称是Model-View-Controler。这里不正是咱们关注的分离点吗
数据库

 

  从这里咱们能够总结如下的概念编程

  视图:一个动态生成HTML页面的模板
  模型:模型是描述程序设计人员感兴趣问题域的一些类,这些类一般封装存储在数据库中的数据,以及操做这些数据和执行特定域业务逻辑的代码。在ASP.NET MVC中,模型就像是一个使用了某个工具的数据访问层,包括实体框架。
  控制器:一个协调视图和模型之间关系的特殊类。它响应用户输入,与模型进行对话,并决定呈现哪一个视图。浏览器

   咱们如今来具体的解读他们之间的联系和各组件之间是怎么通信和协做的,首先,咱们来看View,View的做用很直接,就是现实用户的数据,获取用户的交互。也就是获取输入而后通过处理展示数据。上面一句话提到了“通过处理”,这里就又有了另外的一个问题,通过什么处理,什么东西来处理。其实就是咱们的Controler。它获取用户的输入,通过本身的处理逻辑而后将数据处理操做交给Model进行处理。Model处理了业务逻辑,完成数据以后会有两种操做,一是由Controler处理界面逻辑,更新数据,而后View展示数据。第二种方式是处理完数据,由数据直接反应更改到View。这个时候是不通过Controler处理界面逻辑的,他们之间的关系是一个三角关系。能够从下面的一张图来看出他们之间的关系。

  从上图咱们能够看到M-V-C之间的通信。这些都只是理论层面上的,从代码层面咱们如今尚未看到代码的执行过程。下面咱们来看一个最简单的MVC程序,执行的深层原理咱们之后再讲,这一章咱们只是看一个最简单的程序,看看MVC的执行过程。
  首先,咱们须要建立项目,打开VS,新建一个MVC空项目。这里顺便多说一句为何是空项目。由于这样VS不会帮咱们建立范例代码。若是不选择空程序,VS会帮咱们建立一些范例代码来让咱们了解MVC。框架


咱们这里选择空模板,视图引擎咱们选择Razor。视图引擎指的是咱们操做界面的方式。好比怎么利用数据组合html。这里咱们不用深究Razor,之后的章节会讲到Razor。测试项目咱们这里暂时就不建立,由于咱们单单就是一个示例程序,不须要那么复杂。建立项目以后咱们能够看到以下的文件夹结构。工具

这里咱们解释一下各个文件夹的用途学习

  • App_Data:存放应用程序的数据文件,好比数据库文件,XML等等。
  • App_Start:存放应用程序启动时须要的些类,这里是路由和路由注册的类(路由的概念之后会讲到)
  • Controlers:Controler类的存放目录
  • Models:Model的存放目录
  • Views:View的存放目录
  • Global.asax:全局处理,包含应用程序启动时须要执行的代码,这里是使用App_Start里面的一类来注册路由
  • packages.config:NuGet包管理(暂时不须要了解,之后会讲到)
  • web.config :这个你们都很熟悉了,网站的配置文件

  按照通常的文件夹结构应该是还会有Content这个文件夹,至少在VS2010里是有这个文件件夹的,可是我这里的VS2012是没有这个文件夹的。这个文件夹存放的是网站的通常资源文件,好比js脚本,图片,CSS文件等等,若是没有咱们能够手动添加一个,或者添加一些咱们本身的文件夹。好了,项目咱们是新建出来了,那么,咱们该怎么开始呢?咱们前面讲到了MVC实际就是Model-Controler-View。咱们就从这里开始。首先咱们新建一个Contrler,命名为HoneControler。具体的步骤是咱们能够右键点击Controllers文件夹,添加Controller。
  咱们能够看到以下的界面,这里咱们一切留空,除了命名。模板咱们之后再来深刻的了解。这里咱们只是简单的看看MVC怎么执行的。点击肯定以后咱们能够看到以下的代码测试

  View Code

  下一步咱们修改生成的代码,咱们把返回类型改成string,而后返回一个字符串

  View Code

  下面咱们就能够直接启动项目了,咱们能够看到路径是http://localhost:3222/之类的。咱们在Index中返回的字符串直接输出到浏览器。这里咱们就完成了一个最简单的MVC。可是这个例子是不够来解释咱们MVC的总体执行过程的。咱们在这个例子的基础上扩展来讲明执行过程。这里,咱们一步一步的来完成咱们完成的数据读取的示例。
  咱们添加一个方法到咱们的HomeController,方法名为ShowMessage。

  View Code

  这里须要先解释这几句代码,这里定义了一个返回值为ActionView的方法。ActionView是 一个抽象类型,是指操做(这里是ShowMessage方法)的结果,咱们这里的结果就是返回一个View,也就是咱们的视图。能够看到咱们直接返回了View()。这里咱们须要再解释一个概念-约定优先于配置
约定优先于配置:在之前的不少时候,咱们在想要自定义应用程序中的一些行为时咱们会使用配置文件,或者使用配置文件来制定应用程序中的一些特定行为。约定优先于配置是后来提出的一种概念。它的理念是你们一致遵照一种约定以取代配置对程序的特定行为的指定。这里咱们的约定就是

  • 控制器类以Controller结尾
  • 在View文件夹下有一个与控制器同名的文件夹存在
  • View文件夹下与Controller同名的文件夹下的视图(.cshtml-一种新的类型)的名称与控制器中Action(方法)名称相同。

  因此,这里当咱们直接Retrue View()的时候,解释引擎会直接找到View----Home----ShowMessage视图。因此下面,咱们须要添加一个与ShowMessage方法对应的View。咱们能够右键点击ShowMessage方法。选择添加视图。就会生成对应的视图。

  View Code

  到这里咱们的控制器和视图已经定义完成。打开浏览器输入http://localhost:3222/Home/ShowMessage咱们能够看到咱们在ShowMessage.CSHTML中的h1标签的内容。这里须要注意一点,URL的端口请于本身机器具体端口相关。好了,到了这里,咱们要解释程序的执行过程了。

  当URL进入通道后,运行时会感受URL配置来获取Controller,Action和参数,URL路由的配置在RouteCongfig类中,代码以下

  View Code

  咱们能够看到这里定义了路由规则url: "{controller}/{action}/{id}"不一样的部件以“/”隔开。因此这里划分咱们的URL,Home就是控制器的名称,ShowMessage就是Action的名称,参数咱们这里没有。因此根据划分获得的URL,下面的执行步骤就是实例化HomeController调用ShowMessage方法,而ShowMessage方法返回的是ShowMessageView。因此,咱们就能够在浏览器中看到ShowMessageView了。
 在URL路由规则中,有一行代码defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },这里指定的是默认值,也就是当咱们的URL没有指定Controller,Action,参数时的默认值。回到上面咱们最开始的URLhttp://localhost:3222/。这里,咱们没有指定Controller,Action。因此运行时会使用默认的路由配置来填充URL。这里就会指向http://localhost:3222/Home/Index

  咱们使用了一个示例解释了MVC的执行过程,可是这里能够看到,咱们的示例彻底只使用了C和V,没有使用Model。因此,咱们继续完善咱们的示例,加入数据操做,在Model文件夹下新建一个实体类Person。

  View Code

  在HomeController中添加一个新的Action,名称为ShowPerson,添加完Action以后添加对应的View,咱们要使用这个View来显示Person的数据。

  View Code

  ShowPerson View代码以下

  View Code

  在HomeController中,咱们实例化了Person而且在实例化的时候插入了数据。而且把person装入ViewBag中以供视图使用。这里也就是使用Controller创建了View和Model的联系,可是这种联系是弱类型的。并非直接创建在View和Model之间的。这里咱们先只了解ViewBag实际是一个数据集合。之后会详细的解释ViewBag。

  最后,在浏览器中键入地址http://localhost:3222/Home/ShowPerson 能够看到咱们的person数据。这样咱们就完成了一个典型的MVC程序。固然也是最简单的,咱们先只须要了解什么是MVC,MVC是怎么执行的等等。之后的章节咱们会详细解析每个模块。

相关文章
相关标签/搜索