有名企業に入るには必ず読む.NET面接問題
15790 ワード
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イベントは1つしかありませんが、PageコントロールはPreInit、Init、InitCompleteの3つのフェーズに細分化されます.通常、PreInitフェーズはテンプレートページとトピックのプロパティを設定するために使用されます.Initフェーズになると変更できなくなり、Initフェーズは各サブコントロールのInitイベントを順次呼び出してネーミングコンテナを初期化し、設定します.InitCompleteフェーズはコントロールを有効にしてビューステータス追跡機能を持ちます.
2.ASPについて簡単に述べる.NETのサーバコントロール設計モードと運転モードの違い。
設計モードは開発者のために設計され、開発者がコントロールの表示効果をタイムリーに見ることができ、コントロールの属性と動作を迅速に設定できるようにするが、設計モードでは一部のコントロールライフサイクルのイベント(OnPreRender,Load,CreateChildControlなど)を実行せず、実行モードのみのコンテキスト環境変数も存在しないが、Init,Construct,Render,Render Contents,Disposeなどのイベントはデザインモードで実行されます.OnPrenderイベントでいくつかのリソースファイル(Javascript/CSS/Pictures)を導入する場合、IDEデザイナの状態ではファイルパスは望ましくなく、現在の実行モードでの仮想サーバパスに基づいて取得する必要があります.たとえば、PageコントロールのPageLoadイベントでサーバのコンテキスト環境を参照した場合でも、「情報が取得できません」という異常エラーが表示されます.
3.サーバコントロールのID、UniqueID、ClientIDの違いを簡単に説明します。
各サーバコントロールはID、UniqueIDとClientIDによって一意に識別され、IDは我々が命名したIDであり、UniqueIDはサーバ側のIDであり、ClientIDはクライアントのIDであり、通常、コントロールがサブコントロールとして機能していないか、MasterPageの下にある場合、これら3つは完全に一致しており、コントロールがINamingContainerインタフェースを継承する場合、UniqueIDとClientIDは親コントロールのthisである.UniqueIDにIDを付けて、それぞれ異なる区切り記号($と_)で区切ります.に表示されます.