ASP.NET MVC学习---(四)MVC初窥
前面三篇大幅度的介绍了EF框架
这并不是没有道理的
现在使用mvc开发一般都离不开ef
因为它们相结合可以为你带来完美的体验
当然
前面所描述的仅仅是ef框架的冰山一角
它是一门学问很深的功课
如果你想学好它,请先爱上它~
那么
从现在开始
本门课程的主角--mvc正式登场
废话不多说,开搞~
新建一个mvc4项目
有同学可能会问
3和4我要选哪一个呢?
这个...
最好是4啦
升级版肯定功能比较强大啊~
不过具体强大在哪里,额,去问问google或者度娘吧~
点击确定之后,选择基本
因为如果选择空的话我们要自己手动去添加很多文件
这不太合适吧~
至于其他的选项
我还没玩过= =
如果哪位同学耍过这个玩意儿可以来教教本菜~
这时候会看到
试图引擎有两个选项
aspx和razor视图引擎
aspx顾名思义
就是webform使用的这种<% %>形式的视图引擎
至于razor
这可了不得啊
都说搞mvc开发很爽
很大一部分原因是因为这个razor视图引擎
razor的语法很爽
它以@符号来代替<% %>,在@符号之后编写C#代码
table> <tr> <td> @for (int i = 0; i < 10; i++) { } </td> </tr> </table>
但是这有什么好爽的
不就是换了个符号吗
那我们再看看下面这段代码
<table> @for (int i = 0; i < 10; i++) { <tr> <td> 111 </td> </tr> } </table>
还看不出什么吗?
那在看看aspx视图引擎编写的上面那段代码
<table> <%for (int i = 0; i < 10; i++) {%> <tr> <td> 111 </td> </tr> <% }%> </table>
现在能看清楚什么区别了吗
aspx试图引擎规定C#代码和html代码必须是用<%%>来分开编写的
而razor则允许在@符号中随意的编写html代码
razor在遇到尖括号(<>)的时候都会将其当做html代码处理,而其余的则当做C#代码处理
使用razor程序员可以不用在书写繁杂的<%%>(这几个键按着很不爽吧,痛苦的是还要经常按)
而且使用更容易输入的@符号来代替<%%>
更方便的是它允许使用
@{
代码块
}
的形式来定义一个代码块
好了~
razor就先介绍到这里
现在只要记住选择了它
只要用@就能写C#代码
至于其他的语法我们且学且珍惜~
扯远了唉
回到之前添加项目的时候
选择razor点击确定之后
项目结构如下图
App_Data文件夹作用很简单,用来放一些不想被别人访问的重要数据
放在这个文件夹里面的文件都无法被外界访问
现在我们打开App_Start文件夹看看
发现其中有四个以Config结尾的类
看到Config想到什么?
WebConfig,AppConfig啊!
那么我们就可以猜到这四个类大概就是起到了配置网站的作用(因为放在App_Start里面嘛,肯定是网站启动的时候要配置的呀~)
其他三个我们暂且不看,以后在介绍
重点看看这个RouteConfig类
打开瞧瞧,又不会怀孕,放心大胆的打开吧
说到这里这里想提一下某个坏习惯的问题
以前我在学编程的时候
要是看到一个跟当前程序相关的系统文件,但是又名字又很长很难理解
看起来很牛逼的那种高大上的文件
一看到这种东西我就怕
直接跳过不看,因为觉得这种东西看了也不懂
不知道各位有没有这种习惯
但是现在明白了一个道理
系统的文件怎么了?
还不是人写的吗!
凭什么我不敢看
就点两下鼠标,看懂就是你赚了,看不懂那就算了,反正本就就以为是看不懂的嘛!
但是把它打开又不会费你多大劲!
难道程序会因为你打开一个文件就挂掉然后电脑蓝屏死机无限重启什么的吗?(当然,病毒除外...)
感兴趣,你就去看,说不定程序的关键就是在这里
呃...又扯远了
回归正题= =
打开RouteConfig会看到寥寥的几行代码
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } }大伙知道Route是啥意思吗?
我可是过了英语四级的男人!
不就是路由吗~
这里的路由可不是电脑路由器的那个路由
那么这个路由配置类到底是做啥的?
不着急~我们等下再讨论它,你可以趁机多看几眼加深印象~
那么这个Content文件夹就是用来放一些资源文件的地方
比如图片呀,css样式呀,什么什么的(当然你也可以根据自己的个人爱好来放这些文件)
Scripts不用说了,放js文件的地方
最后剩下Models,Controllers,Views文件夹
等等
好像发现了点什么
这三个文件夹开头第一个字母合起来,不就是mvc吗?!
我是不是知道的太多了...
想要了解这三个文件夹的作用
那么就不得不提到一个mvc的一个特点
约定大于配置
什么意思呢?
在使用mvc的时候
程序员要遵守mvc中的一些约定来进行配置
控制器约定:
控制器其实就是一个类,符合三点要求的类就叫做控制器类
1)必须以Controller结尾
2)必须继承自Controller类
3)必须是非静态类
4)控制器类中,最后return View("Index");表示指定一个视图来展示数据,如果没有参数就是当前action的名字的视图来展示。系统会去指定的路径下(View视图约定)找相应的cshtml文件,如果在本控制器的文件夹没有找到相应的页面,就是shared文件夹下面找
在控制器中,每个非静态的方法都称作一个action(处理用户请求的意思)
视图约定:
1)每个控制器都在View文件夹中有一个对应的文件夹
2)每个控制器的文件夹中都有对应每个action的cshtml文件
3)shared文件夹是每个控制器都可以访问的公有文件夹
这些约定省去了程序员对配置文件的操作,系统可以按照这些约定去执行,这就是约定大于配置的好处
在比如
mvc约定好了
浏览器要访问本网站的一个页面
必须是请求一个控制器下的actin方法
然后在由action方法来返回指定的视图给浏览器展示
Controllers文件夹就是用来放控制器类的地方
我们右键添加->控制器
模板和名称都用默认的就ok
点击确定
public class Default1Controller : Controller { // // GET: /Default1/ public ActionResult Index() { return View(); } }
这就是一个控制器类
我们在Index方法上右键,添加视图
选择razor,其他几个先不选
点击添加
我们会发现Views文件夹自动展开了
并且新增了一个和Default1控制器同名的Default1文件夹
在这个文件夹下还有一个和Index方法同名的Index.cshtml文件
假设现在有这么一个url:http://localhost:10024:Default1/Index
这个url地址就是给本地网站的Default1控制器类,下面的Index方法发送一个请求,并返回一个视图给浏览器展示
向服务器请求Default1控制器下面的index方法,服务器生成一个控制器类并执行Index方法
最后一个Return View会将View文件夹下的与控制器类同名(Default1)文件夹下的与类中方法同名的(Index)视图返回浏览器
我们在看看上面的控制器类,在Index方法中Return View();
如果在View()中没有指定视图,那么Index方法会返回默认的视图
现在和webform不一样了
不是直接请求后台的一个页面
而是请求一个控制器类下面的action方法
了解了以上的基本信息我们就可以对路由进行简单的讨论了
简单来说
路由就是配置访问网站url格式的地方
现在我们回头看看路由配置类
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); } }
在这个路由配置中
规定了url的请求格式必须是先controller,在action,如果有id参数就跟在action的后面,并以/符号分割
例如上面的http://localhost:10024:Default1/Index
并且还设置了controller和action的默认值为Home和Index
也就是说如果只输入网站的域名http://localhost:10024
那么默认会请求Home控制器下面的Index方法
比如说
现在路由里面的url变成了这样子:
url: "{action}/{controller}/{id}"
那么要访问之前的页面URL地址必选变成http://localhost:10024:Index/Default1
它也有可能是这样子的:
url: "{controller}-{action}-{id}"
URL地址必选变成http://localhost:10024:Default1-Index
看出什么名堂来了吗?
我们可以通过路由来控制各种各样的url格式!
传说中的url重写就是这种效果...
屌不屌!
最后我们再来看一张图:mvc简单的请求流程
根据这张图,简单总结一下mvc
M:Model 存储和处理数据的组件,与普通三层的Model相比,三层的Model只有属性,所有的业务操作都是在Dal和Bll层中进行,而Mvc的Model层是领域模型,所有的业务和操作都是在Model中完成的,一个Model就相当于三层的Dal,Bll,Model
V:View 用户接口层组件,主要讲Model层的数据展示给用户C:Control 处理用户交互,Model和View的桥梁,负责从Model获得数据然后传给View展示(处理业务逻辑层返回的数据给UI展示层,是UI逻辑层)
ok,今天的任务完成~
让我们一同走在进步的道路上