asp.net页面模型

原创 2004年09月21日 22:46:00
这两天在看《ASP.NET服务器控件与组件开发》,解决了不少困惑。
从ASP转到ASP.NET的一个很大的原因就是服务器控件的易用性,自动的状态保持,以及方便的事件注册,但当时并不明白是怎么实现的。因为HTTP请求是无状态的,所以在ASP中我们需要将要保存的值在隐藏域里提交回去或者放入SESSION或者COOKIE中。而在.NET中,页面框架实际上是模拟了一个有状态的类似桌面程序的过程。每一个后续的请求都是在前一个请求中断的地方恢复并继续执行。而这种模拟是靠以下几个逻辑阶段实现的。
拿一个TextBox做为例子(别的控件甚至页面和它也差不多),当请求到达页面时,如果它被列入了要生成的控件树,那它就会被页面或者别的控件调用它的构造器来实例化。控件树的生成也是很有意思的,所有派生自Control类的控件(页面也是间接派生自Control),都有可重载的Render和RenderChildren方法和RenderControl(写程序时可以重载这些方法,加入自己的处理逻辑),页面控件首先会建立一个HtmlTextWriter的实例,然后将这个对象传给RenderControl方法,RenderControl方法会检查控件的Visible属性,如果为真,就调用Render方法,Render方法默认的实现会调用RenderChildren方法,而这个方法默认会调用每个子控件的RenderControl方法,这样通过递归,就完成了控件树的生成。下面是从书中看到的代码。
ExpandedBlockStart.gifpublic void RenderContrl(HtmlTextWriter writer){
InBlock.gif
if(Visible)
ExpandedSubBlockStart.gif
{Render(Writer);}
ExpandedBlockEnd.gif}

None.gif
protected virtual void Render(HtmlTextWriter writer)
ExpandedBlockStart.gif
{
InBlock.gifRenderChildren(writer);
ExpandedBlockEnd.gif}

None.gif
protected virtual void RenderChildren(HtmlTextWriter writer)
ExpandedBlockStart.gif
{
InBlock.gif
foreach (Control c in Controls)
ExpandedSubBlockStart.gif
{c.RenderControl(writer);}
ExpandedBlockEnd.gif}

None.gif

而HtmlTextWriter是什么东东呢?查一下MSDN,可以看到它们于System.Web.UI命名空间中,其解释是“在 Web 窗体页上写出一系列连续的 HTML 特定字符和文本。此类提供 ASP.NET 服务器控件在将 HTML 内容呈现给客户端时所使用的格式化功能”。
回到页面模型,每个控件实例化时都会默认调用OnInit方法(引发Init事件),在此过程中可以重载OnInit方法来添加自己的初始化逻辑。然后就到了实现有状态的WEB程序的最重要的几步,最先是页面自动调用TrackViewState方法,跟踪视图状态的更改,并保存到控件的StateTag对象中。如果是回传,则会调用LoadViewState方法,用来恢复ViewState字典,像TextBox这样实现了IPostBackDataHandler接口,则会通过LoadPostData方法更新控件数据状态。再接送就是加载(load),这时所有控件的所有最后状态已经保留。下一步如果是回传,则会触发RaisePostDataChangedEvent方法,如果不是,则进入PreRender,然后保存视图状态,生成控件(Render),卸载(Unload)(清除工作),释放(Dispose)(释放所有资源)。
至此,页面处理完成,处理程序会将生成的HTML流输出到客户端。

ASP.NET MVC 视图与模型绑定

在ASP.NET MVC 中视图与模型是可以直接绑定的,这样就绕过了Controller。这种应用场景主要是做信息的提交,比如用户的注册,订单的提交等等。在蒋金楠的《ASP.NET MVC 5框架揭秘...
  • afandaafandaafanda
  • afandaafandaafanda
  • 2014年12月13日 07:43
  • 2567

ASP.NET页面模型

 一、ASP.NET页面一个ASP.NET页面(或者称为ASP.NET窗体)由以下几个部分组成:1、指令(包括@Page、@Import、@OutputCache、@Implements、@Regis...
  • dodream
  • dodream
  • 2009年11月03日 11:07
  • 1163

asp.net页面模型

两种组织页面的模型:单页模型和隐藏代码(CodeBehind)模型。各自确定和优点:结构问题,单页模型中表现部分和逻辑部分混杂在一起,如要完成的功能比较复杂那么页面的机构就会变得混乱。我们知道asp....
  • sitoto
  • sitoto
  • 2005年07月14日 14:46
  • 1102

【ASP.NET】管道模型

众所周知,我们在使用ASP.NET创建web项目时,会选择ASP.NET WebForm,或ASP.NET MVC 。而他们都是基于ASP.Net 管道模型的,换句话说,管道模型是整个asp.net的...
  • qq_26545305
  • qq_26545305
  • 2017年04月17日 20:48
  • 967

ASP.NET MVC从视图传递多个模型到Controller

 ASP.NET MVC从视图传递多个模型到Controller 从后台组织好数据然后传递到页面倒是水到渠成很方便,因为MVC自身就将这样的需求内建到了这个系统中。我只需要在后台组...
  • baogreat
  • baogreat
  • 2015年05月18日 18:13
  • 1730

Asp.Net页面模型---自定义处理程序

asp.net的默认后辍名为aspx,当我们输入*.aspx的时候, Asp.Net页面模型会实例化某个继承自Page的类,完成从URL到HTML文本的转化,那如果想实现自己的后辍名,如sample,...
  • wormwormwormworm
  • wormwormwormworm
  • 2007年12月07日 13:38
  • 408

ASP.NET运行模型——ASP.NET页面处理过程

  ASP.NET页面:.aspx文本文件当客户端浏览器请求页面时,ASP.NET运行库分析目标文件并将其编译为一个.NET框架类,在此类中动态处理传入的请求。每个页面经过编译后会生成一个相应的Pag...
  • lihuhu
  • lihuhu
  • 2008年04月26日 20:46
  • 510

Asp.net管道模型(管线模型)

转 http://www.cnblogs.com/kuyusea/p/4638395.html 前言                                   为什么我会起这...
  • u010690818
  • u010690818
  • 2017年10月24日 11:42
  • 137

ASP.NET Core MVC 和 Visual Studio入门(四)添加模型

ASP.NET Core MVC 和 Visual Studio入门(四)添加模型   Rick Anderson 和 Tom Dykstra   在要节中将添加一些在数据库中管理电影的类,这些类将成...
  • jhycjhyc
  • jhycjhyc
  • 2017年06月13日 10:17
  • 934

理解ASP.NET MVC中的模型绑定

模型绑定的本质     任何控制器方法的执行都受action invoker组件(下文用invoker代替)控制。对于每个Action方法的参数,这个invoker组件都会获取一个Model Bin...
  • dyllove98
  • dyllove98
  • 2013年06月15日 14:33
  • 5067
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:asp.net页面模型
举报原因:
原因补充:

(最多只允许输入30个字)