MVC学习
再来学习MVC,对比三层架构,从学习三层以来,并在之后的项目中一直都是使用的三层(从未改变过),学习三层之初,还针对三层和MVC比较过,那时连三层的使用还不太熟悉呢,比较出来的结果就是虽然都是分层的理念,但是它们是没有可比性的(baidu say),转而继续学习三层,有句话说得好,欠下的是迟早要还的,现在就来看看MVC和三层有何区别以及接下来对MVC的学习。
对比
先从结构上进行对比:
三层分析
三层中是以WebForm开始的,例如请求http://localhost:4230/User/Login.aspx这个URL,这个请求过程首先是找到根目录下的Login.aspx,然后会由Login.aspx下的Login.aspx.cs进行逻辑处理,然后在依次调用B D层再返回。
MVC分析
再看MVC,上图列举了几种对MVC的认识,但是只有最后一张是正确的。
对于三张错误的MVC,一是对M、V、C的职责理解错误,二是对MVC的工作原理理解错误。
为什么它们都错了?
我们看最后一张图,把Controller提升了,并且我们通过序号看调用顺序,这体现出来的是MVC不同于三层的工作原理。
首先我们通过实际创建运行一个MVCDemo(ASP.Net MVC 默认实例),如果我们像三层的WebForm一样打开http://localhost:4230/Views/User/Login.aspx,运行结果会提示404,找不到页面,为什么找不到页面呢?我们该如何访问呢?
工作流程
我们详细看下MVC模式的工作流程:
说明
这个过程是Controller首先接受用户的输入并调用Model和View去完成用户的请求,所以当在web中产生时间和提交表单时,Controller本身不会输出任何东西也不会做任何处理。它只是接收请求并决定调用哪个Model去处理请求,然后再确定用哪个View来显示返回的值。
所以我们的访问地址应该是http://localhost:4230/User/Login。(User表示UserController,Login表示UserController中Action类型的Login方法。)
路由映射
MVC中Controller和View之间并不存在引用关系,在ASP.NET MVC 中只要Controller中的Action 方法名和View同名,Controller就可以返回数据给想要返回的View。到这我们引入URL路由映射的概念。ASP.NET MVC通过URL路由映射实现Controller与View的分离以及他们之间的交互。
MVC和ASP.NET MVC
MVC是一种模型,是一个宽泛的概念,任何基于Model、 View、Controller对UI应用进行分解的设计都可以成为MVC,并且对于三者之间的交互,也没有严格的限制(例如View和Model可以绕开Controller直接交互),但是实际的开发中就必须要有一个严格的规范。
ASP.NET MVC就是一个MVC模型的框架
说一下Action方法
在ASP.NET MVC中URL都是映射到Controller中的某个Action中,然后由匹配的Action来处理我们的业务逻辑并返回view的。
Controller中的public的方法都被当作是Action方法。Action方法通常返回一个ActionResult的结果。
这其实是ASP.NET MVC的一个约定,在Global中默认对上面说到的路由映射进行约定,其目的很好的减少了开发效率,省去手动配置的过程,当然手动配置可是可以的,如果为了以后的修改及维护,还是约定大于自定义更好。
就ASP.NET MVC而言,和传统的WebForm有何不同呢,MS为什么推出ASP.NET MVC,又有什么优缺点,这是我们学习和使用过程中应该考虑的,考虑他们的原理,考虑他们的适用,值得深入研究。
拓展MVCMVC,MVP,MVVM之异曲同工