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,今天的任务完成~
让我们一同走在进步的道路上
ASP.NET MVC学习---(四)MVC初窥的更多相关文章
- MVC学习四:Razor视图语法
@{ Layout = null; } <hr /> <!DOCTYPE html> @this.GetType().Assembly.Location.ToString() ...
- MVC学习四
第七节 讲述了增加model中类的属性,由于数据库中已存在表,表中没有存在新加的列,所以可以删除数据库或者在数据库中新增一列,另可以在controller中新增一个数据库初始化的类,并在Globa ...
- spring MVC 学习(四)---拦截器,视图解析器
1.接口HandlerInterceptor 该接口包含3个方法,分别是preHandle,postHandle,afterCompletion,分别代表着执行前,执行后,执行完成要执行的方法,其中p ...
- MVC学习笔记---MVC生命周期
Asp.net应用程序管道处理用户请求时特别强调"时机",对Asp.net生命周期的了解多少直接影响我们写页面和控件的效率.因此在2007年和2008年我在这个话题上各写了一篇文章 ...
- MVC学习笔记---MVC的处理管线
漫步ASP.NET MVC的处理管线 ASP.NET MVC从诞生到现在已经好几个年头了,这个框架提供一种全新的开发模式,更符合web开发本质.你可以很好的使用以及个性化和扩展这个框架,但这需要你 ...
- MVC学习笔记---MVC生命周期及管道
ASP.NET和ASP.NET MVC的HttpApplication请求处理管道有共同的部分和不同之处,本系列将体验ASP.NET MVC请求处理管道生命周期的19个关键环节. ①以IIS6.0为例 ...
- MVC学习笔记---MVC导出excel(数据量大,非常耗时的,异步导出)
要在ASP.NET MVC站点上做excel导出功能,但是要导出的excel文件比较大,有几十M,所以导出比较费时,为了不影响对界面的其它操作,我就采用异步的方式,后台开辟一个线程将excel导出到指 ...
- MVC学习笔记---MVC框架执行顺序
一.把路由添加到路由表, 二.注册ControllerBuilder(老板)和默认工厂(DefaultControllerFactory) 2.1默认工厂获取可以创建的Controller. 三.由于 ...
- STM32学习笔记之一(初窥STM32)
怎么做好学习笔记? 答:自我感知-->学习知识-->归纳总结-->自我升华(真正属于自己的知识是,抛开书本,运用时,你还能记得的思想) 自我感知--看到知识概念,先自我感觉那应该是个 ...
- 【MVC学习笔记01】初窥奥秘
前言 最近工作落实了,是我非常喜欢的无线前端,会接触很多新东西啦,需要努力才行.因为会用到backbone,所以要学习MVC啦. MVC(模型-视图-控制器),这种模式最早被用于构建桌面程序和服务器端 ...
随机推荐
- 洛谷 P2312 解方程 解题报告
P2312 解方程 题目描述 已知多项式方程: \(a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\)求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) 均为正整 ...
- The Cave
The Cave 题目描述 给定一棵有n个节点的树,相邻两点之间的距离为1. 请找到一个点x,使其满足所有m条限制,其中第i条限制为dist(x,a[i])+dist(x,b[i])<=d[i] ...
- java中的UDP总结
先说一下关于InetAddress类,用一个小例子: import java.net.InetAddress; import java.net.UnknownHostException; public ...
- 华中农业大学第四届程序设计大赛网络同步赛 J
Problem J: Arithmetic Sequence Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1766 Solved: 299[Subm ...
- ACdream 1023 抑或
Xor Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit Statisti ...
- Semaphore built from mutex in C++11
#include <mutex> #include <condition_variable> using namespace std; class semaphore{ pri ...
- RHEL退出RHN
清除原有数据 rm -rf /etc/sysconfig/rhn/rhn_systemidrm -rf /var/cache/yum/*yum clean all 加载刷新源 yum repolist ...
- vue jsonp解决跨域处理
1.安装vue jsonp npm i -S vue-jsonp 2.在main.js中导入vue-jsonp import VueJsonp from 'vue-jsonp' 通过use方法,挂载到 ...
- 关于SpringMVC的全局异常处理器
近几天又温习了一下SpringMVC的运行机制以及原理 我理解的springmvc,是设计模式MVC中C层,也就是Controller(控制)层,常用的注解有@Controller.@RequestM ...
- Selenium2+python自动化19-单选框和复选框(radiobox、checkbox)【转载】
本篇主要介绍单选框和复选框的操作 一.认识单选框和复选框 1.先认清楚单选框和复选框长什么样 2.各位小伙伴看清楚哦,上面的单选框是圆的:下图复选框是方的,这个是业界的标准,要是开发小伙伴把图标弄错了 ...