1. 罗列ASP.NET服务器控件的运行的生命周期。

一般服务器控件的生命周期包含11个阶段:

/// <summary>
/// 1. 初始化
/// </summary>
/// <remarks>
/// 1. 主要完成控件的初始化,页面通过ProcessRequest方法来递归它的子控件并依次调用对应的OnInit方法;
/// 2. 通过调用TrackViewState方法打开控件的视图状态跟踪功能,以便存储在ViewState中的值在页面回发时能正确的恢复到控件上。
/// </remarks>
protected override void OnInit(EventArgs e)
{
Write("1. OnInit");
base.OnInit(e);
this.Page.RegisterRequiresPostBack(this);
}
/// <summary>
/// 2. 加载视图
/// </summary>
/// <remarks>
/// 本阶段仅在页面回发时执行,事实上页面在第一次执行时还没有获得存在到视图状态中的数据,主要完成加载视图状态到控件的过程,
/// 前提是该控件启用视图状态,在客户端请求过程中,视图状态将存储到一个隐藏域中并回传到服务器,以便页面再次回发时觉得是否执行回发事件。
/// </remarks>
protected override void LoadViewState(object savedState)
{
Write("2. LoadViewState");
base.LoadViewState(savedState);
}
/// <summary>
/// 3. 数据回传处理
/// </summary>
/// <param name="postDataKey">装载了客户端提交的页面控件ID</param>
/// <param name="postCollection">装载了客户端提交的数据</param>
/// <remarks>
/// 本阶段仅在页面回发时执行,主要完成控件数据回传功能,根据客户端提交数据的新值和旧值比较是否执行RaisePostDataChangedEvent方法,
/// 客户端修改窗体数据提交后,将以“&”形式隔开并将数据与ID一一对应起来,根据控件ID来检测是否实现IPostBackDataHandler接口,如果实现
/// 才会调用LoadPostData方法,给其刷新其值的机会。
/// </remarks>
public bool LoadPostData(string postDataKey, NameValueCollection postCollection)
{
Write("3. LoadPostData");
return true;
}
/// <summary>
/// 4. 加载事件
/// </summary>
/// <remarks>
/// 先执行页面的Page_Load事件再递归执行控件的OnLoad事件,主要完成创建控件及初始化,根据视图状态还原控件客户端数据,
/// 经常通过IsPostBack来判断控件是第一次请求页面还是在回发事件中进行相应的代码逻辑处理。
/// </remarks>
protected override void OnLoad(EventArgs e)
{
Write("4. OnLoad");
base.OnLoad(e);
}
/// <summary>
/// 5. 回传事件通知
/// </summary>
/// <remarks>
/// 本阶段仅在页面回发时执行,此方法也是接口IPostBackDataHandler的方法,只有当LoadPostData为true时,RaisePostDataChangedEvent才会被调用。
/// </remarks>
public void RaisePostDataChangedEvent()
{
Write("5. RaisePostDataChangedEvent");
}
/// <summary>
/// 6. 处理回发事件
/// </summary>
/// <remarks>
/// 本阶段仅在页面回发时执行,主要引发回发的客户端事件,成功捕获回发的客户端事件并在服务器端进行处理。前提是必须实现IPostBackEventHandler接口,
/// 根据参数eventArgument来判断是哪个控件触发的回发事件,进而完成相应的事件处理。
/// </remarks>
public void RaisePostBackEvent(string eventArgument)
{
Write("6. RaisePostBackEvent");
}
/// <summary>
/// 7. 预呈现
/// </summary>
/// <remarks>
/// 主要完成控件呈现之前的一些操作,注册控件相应的资源,如:Javascript脚本和隐藏域控件等。
/// </remarks>
protected override void OnPreRender(EventArgs e)
{
Write("7. OnPreRender");
base.OnPreRender(e);
}
/// <summary>
/// 8. 保存视图状态
/// </summary>
/// <remarks>
/// 与LoadViewState正好相反,主要完成存储页面视图状态信息,同时将在页面第一次请求时就会执行,而LoadViewState仅在页面回发时才执行。
/// </remarks>
protected override object SaveViewState()
{
Write("8. SaveViewState");
base.SaveViewState();
return new Pair();
}
/// <summary>
/// 9. 呈现
/// </summary>
/// <remarks>
/// 将控件和字符文本输出到服务器控件输出流中,以HTML的形式呈现在客户端。对于控件而言,可调用RenderControl方法输出流。
/// </remarks>
protected override void Render(HtmlTextWriter writer)
{
writer.Write("<input type='button' name='{0}' value='Click Me!' style='position:absolute;left:20px;top:280px' onclick=\"{1}\"/>",
this.UniqueID, Page.ClientScript.GetPostBackEventReference(this, ""));
Write("9. Render");
base.Render(writer);
}
/// <summary>
/// 10. 卸载
/// </summary>
/// <remarks>
/// 主要完成页面及控件资源的清理,不能等同于当离开一个页面或关闭浏览器时触发,因为依靠页面视图状态使得两次请求看起来是连续的,而两次请求间是无状态的。
/// </remarks>
protected override void OnUnload(EventArgs e)
{
Write("10. OnUnload");
base.OnUnload(e);
}
/// <summary>
/// 11. 释放
/// </summary>
/// <remarks>
/// 释放一些资源,如数据库连接或IO文件流。
/// </remarks>
public override void Dispose()
{
Write("11. Dispose");
base.Dispose();
}
private void Write(string text)
{
HttpContext.Current.Response.Write(text + "<br/>");
}

注:像Page这样的容器型服务器控件具有更细化的生命周期阶段。如对于每一个控件而言,都只有一个Init事件,而Page控件又细化为PreInit、Init、InitComplete三个阶段,通常PreInit阶段用于设置模板页和主题的属性,一旦到了Init阶段将不能再改变,Init阶段将依次调用各子控件的Init事件来初始化并设置命名容器,而InitComplete阶段将启用控件具有视图状态跟踪能力。

2. 简述一下ASP.NET的服务器控件设计模式与运行模式的区别。

设计模式是为开发者而设计,使开发者能及时看到控件的展现效果以便快捷设置控件的属性和行为,但在设计模式下将不执行某些控件生命周期的事件(如OnPreRender,Load,CreateChildControls等),也不存在仅在运行模式下的上下文环境变量,但Init, Construct, Render, RenderContents, Dispose等事件都会在设计模式下执行。如OnPreRender事件要引入一些资源文件(Javascript/CSS/Pictures), 在IDE设计器状态下时文件路径是不可取的,它必须根据当前运行模式下的虚拟服务器路径来获取。再比如在Page控件的PageLoad事件中引用了服务器的上下文环境,也将报"获取不到信息"的异常错误。

3. 简述服务器控件的ID,UniqueID和ClientID的区别。

每一个服务器控件都由ID,UniqueID和ClientID来唯一标识,其中ID是我们命名的ID,UniqueID是服务器端的ID,ClientID是客户端的ID,通常情况下控件没有作为子控件或在MasterPage下时,这三者是完全一致的,如果控件继承了INamingContainer接口,UniqueID和ClientID将以父控件的this.UniqueID加上ID并分别以不同的分隔符($和_)来标识。

进入名企必读的.NET面试题的更多相关文章

  1. .NET工作准备--01前言

    01应聘须知(已过时) -1.了解软件开发大环境.-2.准备简历:不宜超过一页,永远准备中文,模板. -3.渠道:3大网站,中华英才,前程无忧(51job最给力),智联招聘.现在还有猎聘网和100程序 ...

  2. .net工作准备系列--01前言

    注:学习参考朱毅编著的进入IT名企必读200题. 内容重在自我学习与巩固. 前言: 章节划分 01应聘须知 02基础知识(重点) 03进阶知识 04重点应用(aspnet第一部分) 04重点应用(as ...

  3. 《程序员面试金典(第5版)》【PDF】下载

    <程序员面试金典(第5版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382252 内容简介 本书作者Gayle Laakma ...

  4. 一套名企WEB前端面试题,不提供答案

    1.说说你对Doctype的理解 2.web产品开发的流程 3.说说你对盒子模型的理解 4.前端页面有哪三层构成,分别是什么?作用是什么? 5.行内元素有哪些?块级元素有哪些?他们如何相互转化? 6. ...

  5. 【强烈推荐】《剑指Offer:名企面试官精讲典型编程题》一书中IT名企经典面试题

    各位程序猿:         <剑指Offer>一书源自该书作者何海涛坚持更新与编写的博客(http://zhedahht.blog.163.com/),该博客收集整理了大量如微软.Goo ...

  6. 进入IT企业必读的200个.NET面试题

    点击打开链接 点击打开链接 版权声明:本文为博主原创文章,未经博主允许不得转载.

  7. Java基础学习(学习IT企业必读的324个JAVA面试题.pdf 整理)

    一.Java程序基础 javac 文件名.java    编译程序 java 类名               运行java程序 代码规范中,一下几点要注意: 包名:包名是全小写的名词,中间可以由点分 ...

  8. 【面试题】100IT名企java面试必考面试题

    一.Java 基础部分 1.   JAVA 的基本数据类型有哪些 ?   String 是不是基本数据类型 ? Java  有 8 种基本数据类型:           byte    int     ...

  9. 《剑指Offer》- 面试题3

    <剑指Offer——名企面试官精讲典型编程题>  面试题3:  二维数组元素从左到右.从上到下递增,输入一个二维数组和一个整数,  查找该整数. 自己的思路:有序条件下进行查找,当然最简单 ...

随机推荐

  1. matlab中,计算,记录,程序运行,起始,结束 时间,间隔 &matlab中 tic,toc函数的用法

    Tic和toc函数可以计算运行一段时间的代码. 例如: clc tic d=zeros(1,10000); for i=1:10000 d(i)=i; end toc tic c=1; for i=1 ...

  2. django - 修改 request.POST的值

    # querydict改为mutable data = data.copy() data.update({'key_list': DATA_UPLOAD_PARAMETER}) 默认的request. ...

  3. 两个简单的python文件,实现删除本地文件夹和mongodb数据库的内容

    删除本地文件夹: import os , string , datetime ; str = '/home/niuguoqin/tmp/tomcat/'; b = (datetime.datetime ...

  4. hdu 1026 Ignatius and the Princess I(优先队列+bfs+记录路径)

    以前写的题了,现在想整理一下,就挂出来了. 题意比较明确,给一张n*m的地图,从左上角(0, 0)走到右下角(n-1, m-1). 'X'为墙,'.'为路,数字为怪物.墙不能走,路花1s经过,怪物需要 ...

  5. TabHost Tab的添加和删除

    TabHost 添加Tab项: tabhost = this.getTabHost(); TabSpec tabSpec = tabhost.newTabSpec("news"); ...

  6. Android selector item 属性大全(按钮按下不同效果)

    <selector>         必须.必须是根元素.包含一个或多个<item>元素.          Attributes:             xmlns:and ...

  7. Team them up!

    题意: 给出n个人以及认识其他人的情况,现在要把所有人分成两队,每队至少一人,求使两队人数差距最小且每队内部的人都相互认识的分队情况. 分析: 这道题让我学习到了不少,首先看到使差距最小就想到了背包, ...

  8. XTUOJ 1252 Defense Tower 贪心

    题目链接:http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1252 思路:考虑每条边对玩家的伤害 假设连接的节点是u,v,破坏 ...

  9. PHP 正则表达式总结

    可以用字符作为一个通配符来代替除换行符(\n)之外的任一个字符.例如,正则表达式:.at可以与"cat"."sat"."#at"和" ...

  10. login:用户登陆的意思

    login:用户登陆的意思 在思科的设备上有两种登录方式: 一种是本地方式,使用console口: 一种是远程方式(或者叫做网络方式):使用的是telnet等 1.默认情况下,思科的远程访问是禁止的. ...