七个柠檬

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

今天周一又没什么事情要做,明天要去一家公司面试.Net,其实心里也没底,别人会问什么问题。今天写这篇文章是为了舒缓下心里压力,接着上一章我们谈的ASP.NET MVC技术来谈。本文章其实不属于理论教程类型,主要还是偏向于怎么去做以示例为主,只是在每一章节中把个人论点谈一谈,然后在写一个代码演示。废话说完了,来看看讲讲什么把。

---------------------------------------------------------------------------------------------------------------------------------

上一章节我们介绍了下ASP.NET MVC层次结构和MVC这个技术上的介绍,接下来我要补充上一个章节忘记讲述的ASP.NET MVC的页面生命周期。

今天主要安排是这样的,首先我们补充上一节遗漏的技术点。主要讲解如下:

1)页面生命周期

2) URL路由

3)MVC和WebForms本质上区别

4)代码演示

一、页面生命周期

1.在MVC中跟传统的WebForms是不一样的,微软为了让前后台进行代码分离做个不少功夫,首先呢?我先说说传统的WebForms是什么样的页面生命周期。WebForms页面生命周期主要分2个方向我们讨论(事件、页面流程)

         1)页面事件

         当我们看VS工具时候有很多人根本就没考虑过VS为我们做了什么事。VS其实它在按F5运行页面的时候为我们做个这样的几个事情(1:Page_PreInit、2:Page_Init、3:Page_Load、4:Page_PreRender、5:Page_UnLoad)这个WebForms事件有很多人都没想过。接下来我们谈每个事件它做了写什么。1、Page_PreInit主要是负责事件是在页生命周期的早期阶段中可以访问的事件。在PreInit事件后,将加载个性化信息和页主题。2、Page_Init主要是负责服务器控件应执行任何创建和设置实例所需的初始化步骤。在该事件内无法使用视图状态信息;它尚未填充。在该事件的生存期内不应访问其他服务器控件,不论它是此控件的子级还是父级。3、Page_Load主要是负责通知服务器控件执行任何设置为在每次页请求时发生的处理步骤。可以访问该事件的视图状态信息和 Web 窗体 POST 数据。还可以访问页控件层次结构内的其他服务器控件。4、Page_PreRender主要是负责使用该事件在服务器控件呈现给页之前执行任何更新。在该事件的生存期内可以保存服务器控件视图状态的任何更改。不保存呈现阶段内所做的同样更改。5、Page_UnLoad主要是负责在卸载实例前,服务器控件必须在控件生命期的此阶段执行所有最后的清理操作,如关闭文件、关闭数据库连接和丢弃对象。

         2)页面流程

        

图解如下:

         1.请求页

         请求页发生在页生命同期开始之前。当用户请求时,ASP.NET将确定是否需要分析和编译页面,或者是否可以在不运行页的情况下输出页面缓存来进行响应。后者是通过处理@OutputCache指令来控制页面缓存策略的。

         2.开始

         这个阶段用于初始化页面类的属性。用于处理用户的请求还有要回发数据库的响应的对象,Request和Response就在这个过程中设置,还根据是回发请求还是新的请求来设置IsPostBack属性,这些属性对于后面的操作是必须的。

         3.页面初始化

对应的是Page_PreInit事件。页面初始化期间可以使用控件,并将设置每个控件的UniqueID属性。此外,任何主题都将应用于页。如果当前请求是回发请求,那么我们不能在这个阶段获取控件的属性,因为此时控件属性值还未从ViewState中还原。

在这个页面级的事件中,所有在设计时创建的控件都将被用默认值做初始化。例如,如果你有一个Text属性值为”Hello”的TextBox控件,则此时这个属性被设置。这个事件仅仅发生在页级别的类中,用户控件和母版页没有这个事件,而动态设置页面主题也只能在这个事件中进行。

         4.控件加载

         其对应的是Page_Init事件。在Page_Init事件中,读取或者初始化控件的属性,如果当前请求为回发请求,则将使用从视图状态和控件状态恢复的信息加载控件属性。

         5.验证

         在此步骤中,将调用所有的验证程序控件的Validate()方法,此方法将设置各个验证程序控件和页面的IsValid属性。

         6.页面加载

         与其对应的页面事件是Page_Load事件。在Page_Load事件中,可以读取和更新控件属性,一般页面的加载都放在这个事件中去处理。有些人认为这就是Page类第一个触发的方法。这个方法是混淆我们Page生存周期的罪魁祸首之一。

         注意:如果页面是回发(PostBack)的话,在Page_Load之前还会有两个进程:

         加载视图状态:在这个事件中运行时隐藏域中分解出视图状态并加载到所有启用了视图状态的控件中。

         加载回发数据:在这个事件里实现了IPostBackDataHandler接口的控件从HTTP的Post数据中得到值。注意,TextBox控件不能从视图状态中获得值,而是在此事件中从Post数据中获取得值。

         7.回发事件处理

         如果当前请求是回发请求,则ASP.NET将会调用所有的事件处理程序。在这个上步骤中ASP.NET将会根据事件源调用不同的事件处理委托方法来处理请求。我们将在后面的ASP.NET事件模型中详细介绍。需要注意的是,事件处理(比如像Button1_Click()之类的)是定义在ASPX页面中的,有一些开发人员认为当单击一个按钮后会立即触发Button1_Click(),其实在这个事件触发之前首先要触发Page_Load。

         8.呈现

         在这个步骤中,ASP.NET将会处理当前的视图状态,并将其序列化保存到页。接着调用每个控件,将其呈现通过Response.OutputStream输出。

         9.卸载

         在页面完全呈现并准备丢弃时,将调用卸载,对应Page_Unload事件。在这个步骤中,将卸载Page实例并执行清理,包括如关闭打开的文件和数据库连接,完成日志记录或者其他任务。

 

2.MVC页面生命周期

         1)创建RouteTable

         当ASP.NET 应用程序第一次启动的时候才会发生第一步。RouteTable把URL映射到Handler。

         2)UrlRoutingModule 拦截请求

         第二步在我们发起请求的时候发生。UrlRoutingModule拦截了每一个请求并且创建和执行合适的Handler 。

         3)执行MvcHandler

         MvcHandler 创建了控制器,并且把控制器传入ControllerContext,然后执行控制器。

         4)执行控制器

         控制器检测要执行的控制器方法,构建参数列表并且执行方法。

         5) 调用RenderView 方法

         大多数情况下,控制器方法调用RenderView()来把内容呈现回浏览器。Controller.RenderView() 方法把这个工作委托给某个ViewEngine 来做。      

   MVC流程图

    

二、URL路由

         使用默认路由表

         当你创建一个新的ASP.NET MVC 应用程序,应用程序已经配置了默认的URL路由。URL路由在两个地方设置。

         第一,URL路由配置在你的应用程序WEB配置文件中(Web.config文件)。文件中有四个有关路由的配置节:system.web.httpModules节,system.web.httpHandlers节,system.webserver.modules节,和system.webserver.handlers节。小心不要删除这些配置节,因为没有这些配置节路由将不在工作。

         第二,更为重要的是,一个路由表在应用程序的Global.asax文件中创建。Global.asax文件是一个特别的文件,它包含了ASP.NET应用程序生命周期事件处理。当Application Start事件开始,路由被创建。

         -

         routes.IgnoreRoute:IgnoreRoute()是RouteCollection路由表类的扩展方法,用于忽略指定的路由请求。这句意思是忽略对扩展名为.axd文件的请求。

         routes.MapRoute:MapRoute()方法是一个添加路由映射的方法(RouteCollection类的扩展方法)。这里是它最常用的一个重载,映射指定的 URL 路由并设置默认路由值:

         1、"Default"是路由的名称,这个名称在应用程序的路由的集合(routes对象)中是唯一的,如果重名生成时就会报错。

         2、"{controller}/{action}/{id}"代表的是路由的 URL表达式。

         3、 new { controller = "Home", action = "Index", id = UrlParameter.Optional } 声明了一个包含路由值的object匿名对象。

三、MVC和WebForms本质上区别

         以上我们讨论了MVC路由和生命周期,接下来创建一个Controller,我在这里创建这个控制器想说明的是所有的MVC是基于Controller里面的Action,而在WebForms里面所有的操作都是基于事件驱动。(补:在这里创建的自定义Controller如果是继承的是Page类的话,那么此处的MVC将会别手动改变成WebForms模式)

四、代码演示

         此处我演示的例子是自定义的Controller和如何修改Global.asax.cs文件,此功能为Action来检测简单信息

演示步骤如下:

创建Login控制器是用于,当数据提交到后台使用,并要修改方法,因为VS自动生成的是Index,而我这里是IsAdmin页面。

创建IsAdmin视图,用于展示UI给用户

完整以上几步必须修改Global.asax.cs,因为之前VS创建的路由为Home控制器 Index视图。我们这里这样写的原因是,因为我要说明怎么修改路由。

修改前

修改后

以上只是展示这些代码。提供 代码下载

posted on 2013-11-11 14:28  张晓龙  阅读(4932)  评论(0编辑  收藏  举报