1.新增的頁面事件:
在ASP.NET 2.0中,一個ASP.NET頁面的生命週期主要為(紅色字型表示ASP.NET 2.0新增加的階段頁面事件):用戶端請求頁面—》預初始化(OnPreInit)—》初始化(OnInit)—》完成初始化(OnInitComplete)—》載入ViewState(LoadViewState)—》處理回送資料(IPostBackDataHandler)—》Page_OnPreLoad—》Page_OnLoad—》回傳更改通知(RaisePostDataChangedEvent)—》處理回傳事件(RaisePostBackEvent)—》Page_OnLoadComplete—》預呈現(OnPreRender)—》完成預呈現(OnPreRenderComplete)—》儲存ControlState(SaveControlState)—》儲存ViewState(SaveViewState)—》呈現(Render)—》Page_UnLoad。
OnPreInit:在初始化頁面OnInit事件前觸發。在這個階段裡,可以進行定義網站主題(Theme)或載入網站個人化所需要的資料資訊等操作。
OnInitComplete:完成初始化頁面OnInit事件後觸發。
OnPreLoad:在載入頁面OnLoad事件前觸發。
OnLoadComplete:完成頁面載入OnLoad事件後觸發。
OnPreRenderComplete:在完成預呈現OnPreRender事件後觸發。這是完成頁面呈現的最後一道關卡,在此之後,頁面將無法再進行任何呈現上的改動。
SaveControlState:儲存控制項狀態ControlState。ControlState是ASP.NET2.0控制項新增的一個屬性,類似ViewState作用,但它們區別在於ControlState用於儲存更加重要的控制項狀態資訊,以保證在禁用ViewState的情況下還可以對控制項狀態進行讀寫操作。
2.增加對頁面Header的控制:
System.Web.UI.Page類新增加了Header屬性,用於對HTML頁面頭地區裡資料的操作。通過對Header屬性的跟蹤,可以發現,Header屬性儲存著一個實現IPageHeader介面的對象(該對象有LinkedStyleSheets、Metadata、StyleSheet和Title四個屬性),實際上正是通過這個對象實現對HTML頁面頭地區裡資料的操作的。例如:
<script runat="server">
void Page_Load(object sender, System.EventArgs e)
{
this.Header.Metadata.Add("author", "brooks");
}
</script>
其運行結果為:
< html >
< head > <title>Untitled Page</title>
<meta name="author" content="brooks" />
</head>
3.asp.net 2.0中的MaxPageStateFieldLength 屬性
在asp.net 2.0中,可以強制對viewstate進行分段傳輸了,使用的是Page.MaxPageStateFieldLength 屬性,可以設定viewstate中,每個頁面狀態欄位的最大位元組數。格式如下,要在WEB.CONFIG檔案裡設定的:
<pages maxPageStateFieldLength="5" />
其中,將設定把viewstate為不超過5位元組,如果實際的viewstate超過該值,將進行分段傳輸,但每個分段的大小依然不超過maxPageStateFieldLength中的設定值, 預設設定值為-1,表示不對其進行分段傳輸。
4.Click button only once in asp.net 2.0
protected void Page_Load(object sender, EventArgs e)
{
PostBackOptions options = new PostBackOptions(Button1,string.Empty);
StringBuilder sb = new StringBuilder();
if (Button1.CausesValidation && this.GetValidators(Button1.ValidationGroup).Count > 0)
{
options.ClientSubmit = true;
options.PerformValidation = true;
options.ValidationGroup = Button1.ValidationGroup;
sb.Append("if (typeof(Page_ClientValidate) == 'function')");
sb.Append("if(Page_ClientValidate(\"" + Button1.ValidationGroup + "\")==false) return false;");
}
if (!string.IsNullOrEmpty(Button1.PostBackUrl))
options.ActionUrl = HttpUtility.UrlPathEncode(Button1.ResolveClientUrl(Button1.PostBackUrl));
sb.Append("this.disabled = true;");
sb.Append(ClientScript.GetPostBackEventReference(options));
sb.Append(";");
Button1.Attributes.Add("onclick", sb.ToString());
}
5.asp.net 2.0中得到sqldatasource返回的行數
在asp.net 2.0中,gridview是和sqldatasource控制項綁定的,那麼如何得到sqldatasource返回的記錄的行數呢?比如sqldatasource控制項中用select * from ....,如何返回其記錄行數?在.net 2.0中,可以通過sqldatasource的OnSelected事件實現,並且對select事件SqlDataSourceStatusEventArgs參數中的AffectedRows屬性設定一下就可以了,具體核心代碼如下:
protected void SqlDataSource1_Selected(object sender, SqlDataSourceStatusEventArgs e)
{
totalRows.Text = e.AffectedRows.ToString();
}
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="Data Source=(local);Initial Catalog=Northwind;user id=sa;password=123456;" ProviderName="System.Data.SqlClient" SelectCommand="SELECT [CustomerID], [CompanyName], [ContactName] FROM [Customers]" OnSelected="SqlDataSource1_Selected"></asp:SqlDataSource>
6.設定焦點
在asp.net 1.1中,當要在page_load頁面中,設定某個控制項為預設的焦點按鈕(也就是預設焦點是在這個控制項上的),可能要用到javascript的代碼,而在ASP.NET 2.0中,不用這些麻煩了,在form代碼中,使用defaultbutton 和 defaultfocus屬性就可以了,比如
< form id="Form1" defaultbutton="BtnSubmit" defaultfocus="TextBox1" runat="server">
則在頁面載入時,預設的button按鈕時btnsubmit,焦點預設就在texbox1上了
當然也可以通過代碼方式實現,如下
this.Textbox1.Focus(); 或 this.SetFocus(this.Textbox1);
7.asp.net 2.0中的彈出對話方塊
在asp.net 1.1中,要做1個彈出的對話方塊的話,一般是在服務端的代碼中這樣寫:
btnClick.Attributes.Add("onclick", "return confirm('Are you sure?');");
現在在ASP.NET 2.0中,只要使用用戶端的代碼就可以拉,新多了個onclientclick,這樣寫
< asp:button id="btnClick" runat="server" OnClientClick="return confirm('Are you sure?');" text="Button"></asp:button>
在彈出中加入變數:
protected void Page_Load(object sender, EventArgs e)
{
btnAdd.Attributes.Add("onclick","confirm('"+System.DateTime.Now.ToShortDateString()+"');");
//btnAdd.Attributes.Add("onclick", "this.disabled=true;" + this.ClientScript.GetPostBackEventReference(btnAdd, ""));
}
8.自訂的頁面控制項,
比如在ASP.NET 1.1中,要聲明自訂的頁面控制項,
通常要在用到的每頁都要加入register prefix=........這樣的,很麻煩,而在asp.net 2.0中,如果你確定一個頁面自訂控制項要在整個項目中用到,只需要在WEB.CONFIG中加入
< system.web >
<pages>
<controls>
<add tagPrefix="prefixname" namespace="namespacename "/>
</controls>
</pages>
</system.web>
其中prefixname為控制項的標識,namespace為命名空間就可以了。
9.跨頁面資料發送:
如果你需要多個頁面發送資料到同一個表單程式進行處理,或者資料在多個頁面之間傳輸處理的話,你就可以使用ASP.NET 2.0這個新特性。例如,我打算把Default.aspx頁裡TextBox1裡的文本資料發送到Default2.aspx頁面進行處理:
Default.aspx頁:
<%@ Page Language="C#" %>
< script runat="server">
void Button2_Click(object sender, EventArgs e)
{
Label1.Text = "Hi," + TextBox1.Text + ". This is Default.aspx";
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<asp:TextBox ID="TextBox1" Runat="server"></asp:TextBox>
<asp:Button ID="Button1" Runat="server" Text="PostToAnotherPage" PostBackUrl="~/Default2.aspx" />
<asp:Button ID="Button2" Runat="server" Text="PostToSelf" OnClick="Button2_Click" />
<br />
<asp:Label ID="Label1" Runat="server" Text="Label"></asp:Label>
</form>
</body>
</html>
Default2.aspx頁:
<%@ Page Language="C#" %>
< script runat="server">
void Page_Load(object sender, System.EventArgs e)
{
TextBox textBox1 = (TextBox)PreviousPage.FindControl("TextBox1");
this.Label1.Text = "Hi," + textBox1.Text + ". This is Default2.aspx!";
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<asp:label id="Label1" runat="server"></asp:label>
</form>
</body>
</html>