ASP.NET MVC那些事
MVC的由来:
在MVC模式之前,View界面的呈现、用户交互操作的捕捉与相应、业务流程的执行以及数据的存储等都是在一起的,这种设计模式叫自治视图。
这重设计模式主要存在三大弊端:
- 重用性:业务逻辑与UI是不相关的,如果将业务逻辑与UI绑定在一起,业务逻辑将无法被重用。
- 稳定性:业务逻辑、UI逻辑、视图界面三者的稳定性不同,绑定在一起会由最差的部分影响到整体,即“短板理论”。(就像一个坏木桶里的水,会从缺口的最低处先流出来)
- 可测试性:当UI与逻辑部分绑定在一起,极大的增加了测试难度。
因此,为了解决这些问题,有人采用了关注点分离的原则,将视图界面、业务逻辑、UI逻辑三者分离开,并采用合理的交互模式将他们之间的依赖度降到了最低。这种模式就是MVC。
什么是MVC模式:
MVC分别代表着Model、View、Controller,从人机交互的角度来说,View会捕获到用户的操作直接发给Controller,Controller会主动去完成相应的UI逻辑,但如果设计到了业务功能,
Controller还会调用Model来合作完成。在完成相应的UI逻辑后,Controller根据需要控制原View或者创建新的View对用户操作予以响应。
什么是ASP.NET MVC:
一句话概括:ASP.NET MVC就是建立在ASP.NET平台上,基于MVC模式的,Web应用框架。
详细点说:ASP.NET平台采用管道式设计,具有良好的扩展性。整个ASP.NET MVC框架就是通过自定义ASP.NET的HttpModule和HttpHandler这两个核心组件而建立的。
注:MVC中的Model主要体现为维持应用状态并提供业务功能,但ASP.NET MVC中的Model与之是不同的,后者仅仅是绑定到View上的数据而已,两者并不是一回事,在学习理解过程中要格外注意,不要混淆。
ASP.NET MVC是如何运行的:
当一个用户请求提交上来后,ASP.NET MVC会针对当前请求实施路由解析,解析的目标就是找到用户需要的Controller并激活它,执行对应的Action方法,最终返回用户需要的东西。
也就是说,当ASP.NET MVC接收到抵达的请求后,首要任务就是通过该请求解析得到对应的Controller和Action名称,那么它是如何解析的呢?这就要了解一下Asp.Net MVC的路由系统了。
ASP.NET MVC路由系统:
路由是干什么的?
对于ASP.NET MVC应用来说,来自浏览器的请求总是指向定义在某个Controller类型中的某个Action方法,请求URL与目标Controller/Action之间的映射就需要路由来实现。
路由是如何工作的?
在ASp.NET MVC的App_Start文件夹的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对象,并将其添加到全局路由表中。
什么是全局路由表?它是做什么的?
全局路由表是由ASP.NET定义的,路由表中的每个Route对象包含一个路由模板,Controller和Action的名字以占位符的形式,即{controller}{action}的形式定义在模板中,对于
每一个抵达的HTTP请求,路由系统会遍历路由表并找到一个具有与当前请求URL模式相匹配的Route对象,然后利用它解析出以Controller和Action名称为核心的路由数据。
MapRoute()方法是做什么的?
这个方法的意义在于向路由系统中添加自定义的一个URL映射规则。怎么添加的呢?这是根据系统上下文中的RouteTable对象中的RouteCollection类型的属性Routes,而在MapRoute()方法中的实现说白了就是根据参数生成Route对象,并且添加Route对象到服务器中。
简单来说,这段代码实现的功能就是按{controller}/{action}/{id}这种格式解析URL地址,得到对应的Controller和Action。如果没有,则跳转默认地址,即/Home/Index。
通过路由系统得到了需要的Controller和Action名称后,接下来要做的就是激活Controller对象,执行Action方法了。
controller的激活:
Controller对象的激活是通过工厂模式实现的,在激活Controller的工厂中有一个IControllerFactory接口,该接口具有唯一方法CreateController,根据当前请求的上下文和通过路由解析得到的Controller名称来激活相应的Controller对象。代码如下:
Public interface IControllerFactory
{
IController CreateController(RequestContext requestContext,
string controllerName);
}
Action的执行:
Action的执行主要是通过Controller的基类ControllerBase中的Execute方法来执行的,如果目标Action方法返回类型为ActionResult,则还需要执行该ActionResult对象对当前请求予以响应。
在ASP.NET MVC框架中,两种情况的执行都是通过ActionInvoke对象来完成的。
public interface IActionInvoker
{
void InvokeAction(ControllerContext controllerContext,string actionName);
}
ActionInvoke对象中定义了一个接口IActionInvoker,该接口定义了唯一的方法InvokeAction,该方法第一个参数为当前Controller的上下文对象,第二个参数为需要激活的Action名称。
链接:http://www.cnblogs.com/sundar/p/5840818.html
ASP.NET MVC那些事的更多相关文章
- Asp.net MVC验证哪些事(2)-- 验证规则总结以及使用
上篇文章Asp.net MVC验证那些事(1)-- 介绍和验证规则使用中,介绍了Asp.net MVC中的验证功能以及如何使用.这里将对MVC中内置的验证规则进行总结. 一,查找所有验证规则 上篇文章 ...
- Asp.net MVC验证那些事(4)-- 自定义验证特性
在项目的实际使用中,MVC默认提供的Validation Attribute往往不够用,难以应付现实中复杂多变的验证需求.比如, 在注册用户的过程中,往往需要用户勾选”免责声明”,这个checkbox ...
- 用ASP.NET MVC仿站糗事百科
废话就不多说,直接来操作,有些细节问题就不一一解说了(没有几天几夜都说不完),主意是想让大家看完知道大概这个框架是怎么搭建的就可以了 一. 新建一个解决方案,搭建三层架构,分别为: DAL层 .DL ...
- ASP.NET MVC之单元测试分分钟的事
一.为什么要进行单元测试? 大部分开发者都有个习惯(包括本人在内),常常不喜欢去做单元测试.因为我们对自己写的程序总是盲目自信,或者存在侥幸心理每次运行通过后就直接扔给测试组的妹子们了.结果妹子一测, ...
- Asp.net MVC验证那些事(1)-- 介绍和验证规则使用----[转]--[并修改了部分内容]
Asp.net MVC验证那些事(1)-- 介绍和验证规则使用 -----原文地址链接 数据的有效性验证,是程序开发中必不可少的环节.这篇文章,我们将用一个实例来说明如何在MVC中使用Validati ...
- 在 ASP.NET MVC 中使用 HTML Helpers 的那些事
在 ASP.NET MVC 中使用 HTML Helpers 方法,可以返回得到标准的 HTML 标签,就像 <input>.<button> 或者 <img> 等 ...
- Asp.net MVC验证哪些事(3)-- Remote验证及其改进(附源码)
表单中的输入项,有些是固定的,不变的验证规则,比如字符长度,必填等.但有些是动态的,比如注册用户名是否存在这样的检查,这个需要访问服务器后台才能解决.这篇文章将会介绍MVC中如何使用[RemoteAt ...
- ASP.NET MVC必须知道的那些事!
MVC的由来: 在MVC模式之前,View界面的呈现.用户交互操作的捕捉与相应.业务流程的执行以及数据的存储等都是在一起的,这种设计模式叫自治视图. 这重设计模式主要存在三大弊端: 重用性:业务逻辑与 ...
- IIS+Asp.Net Mvc必须知道的事(解决启动/重启/自动回收站点后第一次访问慢问题)
问题现象: Asp.net Mvc站点部署在IIS上后,第一个用户第一次访问站点,都会比较慢,确切的说是访问站点的Action页面(即非静态页面,因为静态页面直接由IIS处理返回给用户即完成请求,而A ...
随机推荐
- ci默认控制器
默认控制器 前面提到,如果在请求中没有指明具体的控制器,CI将会把页面重定向到一个系统默认的页面.这个默认页面可以自己设定,它存放在如下地址:/system/application/config/ro ...
- WinForm中动态添加控件 出现事件混乱,解决办法记录。
还是在抢票软件中出的问题,我没点击一个联系人,要生成一排控件,其中有席别combobox这样的下拉框控件,会出现如下图所示的问题:问题描述:在代码中动态创建的控件,事件混乱了,一个控件触发了所有同类型 ...
- String与Date、Timestamp互转
一.String与Date(java.util.Date)互转 1.1 String -> Date String dateStr = "2010/05/04 12:34:23&quo ...
- 简单的分页存储过程,Json格式日期转换为一般日期
简单的分页存储过程 CREATE PROC Paged @pageIndex INT, @pageCount INT OUTPUT, @pageSize INT AS DECLARE @count I ...
- C语言中strstr函数
头文件:#include <string.h> strstr()函数用来检索子串在字符串中首次出现的位置,其原型为: char *strstr( char *str, char * ...
- 提高php运行效率的50个技巧
1.如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍. 2.并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存. 3.方法调用看 ...
- [Effective JavaScript 笔记]第55条:接收关键字参数的选项对象
53节建议保持参数顺序的一致约定对于帮助程序员记住每个参数在函数调用中的意义很重要.参数较少这个主意不错,但如果参数过多后,就出现麻烦了,记忆和理解起来都不太容易. 参数蔓延 如下面这些代码: var ...
- 安装 openSUSE Leap 42.1 之后要做的 8 件事
导读 openSUSE Leap 确实是个巨大的飞跃,它允许用户运行一个和 SUSE Linux 企业版拥有同样基因的发行版.和其它系统一样,为了实现最佳的使用效果,在使用它之前需要做些优化设置. 下 ...
- 把 表拷贝到test测试数据库
(文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) bundle exec rake db:schema:load RAILS_ENV=test 注 ...
- 对target="framename"的理解(实现分页的demo)
先上图,说明一下我主要想实现什么功能. 一.演示图 演示首页: 演示内容页(包括按钮切换页+模板内容页): 演示首页到演示内容页的一个演变过程: