MVC 模式是一种表现模式。它将web应用程序分成三个主要组件即:视图(View)控制器(Controller)模型(Model)
- M:Model 主要是存储或者是处理数据的组件 Model其实是实现业务逻辑层对实体类相应 数据库操作,如:CRUD(C:Create/R:Read/U:Update/D:Delete)。它包括数据、验证规则、数据访问和业务逻辑等应用程序信息。
- V:View 是用户接口层组件。主要是将Model中的数据展示给用户。ASPX和ASCX文件被用来处理视图的职责。
- C: Controller 处理用户交互,从model中获取数据并将数据传给指定的view
需要注意: MVC目的不是取代WebFrom开发,只是web开发的另外一种选择,微软2009对外公布的第一个开源的表示层框架,这是微软的第一个开源项目。关于mvc和WebFrom的比较后面会有描述。
以下为引用:
1 新建项目后的文件组织结构
(1)新建一个ASP.Net MVC 4项目,选择“基本”配置与“ASPX”视图引擎(暂时不用Razor引擎)。
(2)VS为我们生成的基本文件组织结构如下图所示:
可以看出,VS默认帮我们创建好了Models、Views以及Controllers的三个文件夹,这三个文件夹就构成了我们的ASP.Net MVC模式的项目。其中,Controllers是所有控制器的类文件所在,而Models则是所有模型的类文件所在,而Views则是所有cshtml或aspx的文件所在。
2 控制器的“约定大于配置”
在Controllers中新建一个控制器,取名为HomeController。在默认的Index这个Action中新建一个视图,默认名为Index即可。
(1)Controller放到controllers文件夹中,并且命名方式以Controller结尾
(2)每个Controller都对应View中的一个文件夹,文件夹的名称跟Controller名相同
(3)Controller中的方法名都对应一个View视图(非必须,但是建议这么做)而且View的名字跟Action的名字相同
(4)控制器必须是非静态类,并且要实现IController接口
(5)Controller类型可以放到其他项目中
3 视图的相关约定
(1)所有的视图必须放到Views目录下
(2)不同控制器的视图用文件夹进行分割,每个控制器都对应一个视图目录
(3)一般视图名字跟控制器的Action相对应(非必须)
(4)多个控制器公共的视图放到Shared:例如公用的错误页、列表模板页、表单模板页等等;
4 数据传递的桥梁-ViewData与ViewBag
首先,ViewData是一个Key/Value对的字典集合数据结构,用于在Controller和View之间构建起传递数据的桥梁。
(1)ViewData是Controller的属性,此属性是继承ControllerBase而来。
(2)ViewPage下也有一个ViewData的一个属性
(3)控制器的Action方法执行完成后,返回ViewResult,然后MVC框架在执行ExcuteResult方法时,Controller中的ViewData数据会传递给ViewPage类,其实就是把Controller的ViewData赋值给ViewPage页面的ViewData属性。
(4)ViewBag传递数据:我们对ViewBag的动态属性进行赋值,值实际上是存到了ViewData中,动态属性的名存成了ViewDataDictionary的键,动态属性的值存成了ViewDataDictionary的值。
PS:ViweBag其实是就一个包含了一层Dynamic的ViewData,两个兄弟共用的是一个容器。
(5)ViewData与ViewBag的比较
ViewData | ViewBag |
它是Key/Value字典集合 | 它是dynamic类型对像 |
从Asp.net MVC 1 就有了 | ASP.NET MVC3 才有 |
基于Asp.net 3.5 framework | 基于Asp.net 4.0与.net framework |
ViewData比ViewBag快 | ViewBag比ViewData慢 |
在ViewPage中查询数据时需要转换合适的类型 | 在ViewPage中查询数据时不需要类型转换 |
有一些类型转换代码 | 可读性更好 |
(6)如何在程序中使用ViewData与ViewBag
①在Controller中的代码
1
2
3
4
5
6
|
public ActionResult Index() { ViewData[ "Name" ] = "Edison Chou" ; ViewBag.Name = "Edison Chou" ; return View(); } |
②在View中的代码
1
2
3
4
5
6
7
8
9
10
11
12
13
|
< body > < div > < h1 >Hi,ASP.Net MVC First Demo!</ h1 > <% for (int i = 0; i < 5 ; i++) { Response.Write("Hello World!"); } %> < p ><%: ViewData["Name"] %></ p > < p ><%: ViewBag.Name %></ p > </ div > </ body > |
5 路由机制初步了解
我们通过调试可以知道,在MVC中所有的请求都归结到控制器下面的Action。所以,所有的请求都是要指定一个具体的Action,Url的格式是根据路由规则来定的。那么,在ASP.Net MVC的路由规则默认又是什么,在哪里设置的呢?
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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 } ); } } |
打开App_Start文件夹,可以找到RouteConfig这个类,查看RouteConfig这个类的方法,可以知道原来是RegisterRoutes这个方法为我们的ASP.Net MVC项目设置了默认的路由规则:{controller}/{action}/{id},也就是说我们可以通过http://localhost/Home/Index/1这种URL来访问项目。如果我们想要改变默认的路由规则,例如我们想要以这种URL:http://localhost/Home-Index-1来访问项目,则直接将上面的默认路由规则改为:{controller}-{action}-{id}即可。
MVC和WebForm的对比:
WebForm模型:
MVC请求模型:
- MVC优点:
- 1. 很容易将复杂的应用分成M、V、C三个组件模型,通过model、view、controller有效的简化了复杂的架构,将处理后台逻辑代码与前台展示逻辑进行了很好的分离。
- 2. 因为没有使用server-based forms,所以程序员控制的会更加灵活,页面更加干净,没有viewstate。
- 3. 通过修改路由规则,可以控制生成自定义的url,因此控制生成seo友好的url将更加容易。
- 4. 强类型view实现,更安全,更高效。
- WebForm优点:
- 1. 支持事件模型开发。有丰富的服务器端组件。
- 2. 控件丰富
- WebForm缺点:
- 1. 封装太强,很多底层东西让初学者不是很明白,
- 2. 自定义控制不灵活,
- 3. ViewState处理。
注: MVC和WebForm的一次性能对比:http://www.cnblogs.com/mikelij/archive/2012/07/09/2581768.html
说点什么
欢迎讨论