首先建立好ASP.Net網站後,若要最乾淨的,就新增一個空的網站。

建立完後,什麼都沒有,只有一個web.config檔。接著使用新增項目,新增一個Web Form,預設會將Code-Seperation功能開啟,也就是將視覺的.aspx檔和邏輯的.cs程式碼分開,用到的是class中的partial方法(反應在@page中的CodeFile屬性中),很多人會將Code-Seperation說成Code-Behind,這樣稱呼是有點問題的,因為Code-Behind是.Net 1.1之前的舊技術,後來改經改名叫Code-Seperation了,但大家很常會「混用」,但明白什麼意思就好了,細節在這就不多提了。

在Default.aspx中的第一行@page設定:

<%@ Page Language="C#" AutoEventWireup="false" CodeFile="Default.aspx.cs" Inherits="_Default" %>

其中,有個AutoEventWireup="true"的屬性,不知是做什麼用的,感覺挺讓人不安的呢!?

 

這個設定值,如果拿掉,基本上ASP.Net預設是false,若要改變這個預設值,可以在web.config中,在<system.web>內,加上一個<pages>的設定,如下:

<configuration>

    <system.web>
        <compilation debug="false" targetFramework="4.0" />
        <pages autoEventWireup="true" />
    </system.web>

</configuration>

 

這樣設定之後,在.aspx中,若不設定autoEventWireup屬性,自動就會以true來設定。當然,若是在.aspx中設定的值,一定會覆蓋掉web.config中的設定,因為specific設定一定會優於general,這很好理解。

 

這個設定值若設為true,則網頁會自動綁定Page_Load()的委派事件,也就是說,這個aspx被呼叫時,CodeFile中的Page_Load()會自動執行。

可以在Page_Load()中寫個簡單的Response.Write("something from Page_Load");

然後將autoEventWireup設定成true以及false,然後看看網頁執行的差別。若是設定成true時,Page_Load()就會自動被執行,若設定成false,則否。若設定成false時,要怎麼手動自己去讓Page_Load執行呢?

這時候就需要覆寫(override)Page類別的OnInit()方法,將Page之中的Load事件處理常式委派給Page_Load(),在_Default.aspx.cs中寫法如下:

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = this.IsPostBack.ToString();
    }

    protected override void OnInit(EventArgs e)
    {
        this.Load += new EventHandler(this.Page_Load);
    }
}

如此一來,網頁執行時,會照著Page類別的物件該走的流程來運作,在Load完成的事件發生時,會觸發其所委派的Page_Load方法,也就會執行我們所印出來的那個字串。由於將AutoEventWireup="true",有時候會在邏輯上不預期的情況下可能會將Page_Load執行兩次,或者在某些特定情況下不需要使用自動事件綁定的功能,則需要自行手動來呼叫Page_Load。由於其使用到了委派事件的作法,因此使用之前,如果了解一下Delegate的用法會比較不會覺得不知其所以然。

arrow
arrow
    全站熱搜

    rexmen 發表在 痞客邦 留言(4) 人氣()