有名企業に入るには必ず読む.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を付けて、それぞれ異なる区切り記号($と_)で区切ります.に表示されます.