天天看點

【轉】ASP.NET 3.5 開發範例精講精析--讀書筆記

1. 使用 <%$ expressionPrefix: expressionValue %> 支援從配置檔案web.config 中取得連接配接字元串和應用程式設定,或從資源檔案(.resx 或 .resource)中取得特定項的設定值。

(1)使用<%$ ConnectionStrings: 配置檔案中的連接配接字元串名稱CONNECTION STRING NAME %>

(2)使用<%$ AppSettings: 配置檔案中appSettings中的配置KEY %>

(3)使用<%$ Resources: Class, ResourceID %> 取得資源檔案中的設定。

上面的Class 就是資源檔案的主檔案名,如Message.resx 資源檔案的 Message 檔案名稱;ResourceID 則是所要取得的資源項目的名稱。

2. 怎樣在網頁中檢測浏覽器的類型和版本

可以使用HttpRequest.Browser 屬性查詢浏覽器,HttpRequest.Browser 屬性有一個HttpBrowserCapabilities 對象,該對象會取得浏覽器或用戶端裝置的資訊。示例代碼如下:

            StringBuilder sb = new StringBuilder();

            HttpBrowserCapabilities bc = Request.Browser;

            sb.AppendLine("浏覽器的相關規格與資訊:");

            sb.AppendLine("類型: " + bc.Type);

            sb.AppendLine("名稱: " + bc.Browser);

            sb.AppendLine("版本: " + bc.Version);

            sb.AppendLine("主要版本: " + bc.MajorVersion);

            sb.AppendLine("次要版本: " + bc.MinorVersion);

            sb.AppendLine("作業平台: " + bc.Platform);

            sb.AppendLine("是 Beta 版嗎: " + bc.Beta);

            sb.AppendLine("是 Crawler 搜尋引擎嗎: " + bc.Crawler);

            sb.AppendLine("是 AOL 浏覽器嗎: " + bc.AOL);

            sb.AppendLine("是 Win16 計算機嗎: " + bc.Win16);

            sb.AppendLine("是 Win32 計算機嗎: " + bc.Win32);

            sb.AppendLine("是否支援架構: " + bc.Frames);

            sb.AppendLine("是否支援表格: " + bc.Tables);

            sb.AppendLine("是否支援 Cookies: " + bc.Cookies);

            sb.AppendLine("是否支援 VB Script: " + bc.VBScript);

            sb.AppendLine("是否支援 JavaScript: " + bc.EcmaScriptVersion.ToString());

            sb.AppendLine("是否支援 Java Applets: " + bc.JavaApplets);

            sb.AppendLine("是否支援 ActiveX 控件: " + bc.ActiveXControls);

            sb.AppendLine("是否支援頻道定義格式: " + bc.CDF);

            TextBox1.Text = sb.ToString();

上述代碼的運作結果:浏覽器的相關規格與資訊:

類型: IE8

名稱: IE

版本: 8.0

主要版本: 8

次要版本: 0

作業平台: WinNT

是 Beta 版嗎: False

是 Crawler 搜尋引擎嗎: False

是 AOL 浏覽器嗎: False

是 Win16 計算機嗎: False

是 Win32 計算機嗎: True

是否支援架構: True

是否支援表格: True

是否支援 Cookies: True

是否支援 VB Script: True

是否支援 JavaScript: 1.2

是否支援 Java Applets: True

是否支援 ActiveX 控件: True

是否支援頻道定義格式: False

3. 網頁之間怎麼傳遞資料

(1)通過在URL中使用查詢字元串傳遞資料;

(2)Server.Transfer 方法傳遞資料;

SOURCEPAGE frmSource = ((SOURCEPAGE) (HttpContext.Current.Handler));

取得源網頁對象,然後就可以取得其公有屬性了。

(3)跨網頁傳送資料的方式;

在目标頁面,通過如下方式取得SOURCE PAGE:

if(Page.PreviousPage != null)

{

TextBox txtName = (TextBox) Page.PreviousPage.FindControl("txtName");

....................

}

還有一種辦法是,通過在目标頁面添加一個 @PreviousPageType 訓示符:

<%@ PreviousPageType VirtualPath="~/SOURCEPAGE.aspx"%>

這樣,就可以取得代表源網頁的強類型引用了 -- PreviousPage 屬性,通過PreviousPage 屬性取得源網頁的公有屬性。

另外一個辦法是,在目标頁面使用 @Reference 訓示符:

<%@ Reference Page="~/SOURCEPAGE.aspx" %>

範例代碼:

            if (Page.PreviousPage != null)

            {

                // 取得來源網頁之各個控件的值。

                textboxName.Text = ((TextBox)(this.PreviousPage.FindControl("txtName"))).Text;

                textboxAddress.Text = ((TextBox)(this.PreviousPage.FindControl("txtAddress"))).Text;

                textboxPhone.Text = ((TextBox)(this.PreviousPage.FindControl("txtPhone"))).Text;

                textboxGender.Text = ((RadioButtonList)(this.PreviousPage.FindControl("rblGender"))).SelectedValue;

                textboxJob.Text = ((DropDownList)(this.PreviousPage.FindControl("ddlJob"))).SelectedValue;

                // 将 PreviousPage 屬性轉換成來源網頁型别。

                SOURCEPAGE mySourcePage = (SOURCEPAGE)PreviousPage;

                // 取得來源網頁之各個公用屬性的值。

                lblName.Text = mySourcePage.Author;

                lblCompany.Text = mySourcePage.Company;

                lblAddress.Text = mySourcePage.Address;

                lblRequestTime.Text = mySourcePage.RequestTime;

            }

(4)不同Web應用程式中網頁的跨網頁資料傳送

在目标網頁中通過 Request.Form 來讀取傳送的值,Request.Form 會傳回一個NameValueCollection 的字典集合,含有索引key 和 資料值的配對。

            System.Text.StringBuilder sb = new System.Text.StringBuilder();

            System.Collections.Specialized.NameValueCollection postedValues = Request.Form;

            String nextKey;

            for (int i = 0; i < postedValues.AllKeys.Length; i++)

                    nextKey = postedValues.AllKeys[i];

                    sb.Append("<br>");

                    sb.Append(nextKey);

                    sb.Append(" = ");

                    sb.Append(postedValues[i]);

            lblMessage.Text = sb.ToString();

4. 設定網頁的預設焦點控件和預設按鈕

<form id="form1" runat="server" defaultbutton="btnSearch" defaultfocus="txtTarget">

【轉】ASP.NET 3.5 開發範例精講精析--讀書筆記

隻有實作了 IButtonControl 接口的控件才能被設定為預設按鈕,也就是說,隻有 Button, LinkButton 和 ImageButton 伺服器控件才能設定為預設按鈕。

5. 讓網頁到約定幾秒自動重定向到其他的頁面

<head id="Head1" runat="server">

    <meta http-equiv="REFRESH" content="3; URL=http://www.entlib.com" />

    <title>倒數 3 秒後自動重定向到其他網頁</title>

</head>

通過程式控制為網頁添加meta 标記:

        protected void Page_Load(object sender, EventArgs e)

        {

            HtmlMeta meta = new HtmlMeta();

            meta.Attributes.Add("http-equiv", "REFRESH");

            meta.Content = "3; URL=http://www.entlib.com";

            this.Header.Controls.Add(meta);

        }

6. Literal 控件和 Label 控件的差別

Label 伺服器控件的文本在顯示為網頁時,使用HTML 的<span> 标記,而Literal 伺服器控件的文本在顯示網頁中時,不會添加 <span> 标記和任何其他的 HTML 标記。

Literal 控件提供的 Mode 屬性可以對 Text 屬性的内容進行設定是否編碼,有如下可行值。

LiteralMode.PassThrough

LiteralMode.Encode

LiteralMode.Transform

示例代碼:

            // 建立一個 Literal 伺服器控件。

            Literal MyLiteral1 = new Literal();

            MyLiteral1.Mode = LiteralMode.PassThrough;

            MyLiteral1.Text = "現在的日期時間是: <b><font color = 'red'>" + System.DateTime.Now + "</font></b>";

            // 将 Literal 伺服器控件動态加入 Panel 容器中。

            MyPanel1.Controls.Add(MyLiteral1);

            Literal MyLiteral2 = new Literal();

            // 要求使用 HtmlEnocde 方法來編碼 Text 屬性的内容。

            MyLiteral2.Mode = LiteralMode.Encode;

            MyLiteral2.Text = "現在的日期時間是: <b><font color = 'red'>" + System.DateTime.Now + "</font></b>";

            MyPanel2.Controls.Add(MyLiteral2);

7. 資料類型驗證

CompareValidator 驗證控件可以驗證輸入到控件中的資料能否轉換成特定的資料類型。方法是:

(1)将Type 屬性設定成需要檢查的資料類型;

(2)必須将Operator 屬性設定為 DataTypeCheck;

        請輸入您所要查詢的員工的出生日期:

        <br />

        請輸入下限:

        <asp:TextBox ID="txtBirthdayLowerLimit" runat="server"></asp:TextBox>

        <asp:CompareValidator ID="CompareValidator1" runat="server" ErrorMessage="" ControlToValidate="txtBirthdayLowerLimit"

            Display="Dynamic"

Operator="DataTypeCheck" SetFocusOnError="True"

Type="Date">您輸入的日期格式不正确!</asp:CompareValidator>

        請輸入上限:

        <asp:TextBox ID="txtBirthdayUpperLimit" runat="server"></asp:TextBox>

        <asp:CompareValidator ID="CompareValidator2" runat="server" ErrorMessage="" ControlToValidate="txtBirthdayUpperLimit"

            Display="Dynamic" Operator="DataTypeCheck" SetFocusOnError="True" Type="Date">您輸入的日期格式不正确!</asp:CompareValidator>

格式驗證

若要檢查使用者輸入的資料是否符合特定的格式,可使用 RegularExpressionValidator 驗證控件。在使用 RegularExpressionValidator 驗證控件時,除了設定 ControlToValidate, Text, Display 等屬性外,還需要設定 ValidationExpression 屬性的正規表達式。

如下範例代碼:

    <div>

        公司網址:

        <asp:TextBox id="txtUrl" runat="server" Width="289px"></asp:TextBox>       

        <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="txtUrl"

            Display="Dynamic">必須輸入資料,不可以空白!</asp:RequiredFieldValidator>

        <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ControlToValidate="txtUrl"

            Display="Dynamic" ValidationExpression="

        電子郵件:

        <asp:TextBox ID="txtEmail" runat="server" Width="284px"></asp:TextBox>

        <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="txtEmail"

        <asp:RegularExpressionValidator ID="RegularExpressionValidator2" runat="server" Display="Dynamic"

            ControlToValidate="txtEmail" ValidationExpression="^[\w-]+@[\w-]+\.(com|net|org|edu|mil)$">請輸入格式正确的電子郵件!</asp:RegularExpressionValidator>

        市内電話:

        <asp:TextBox ID="txtPhone" runat="server" Width="236px"></asp:TextBox>

        <asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" ControlToValidate="txtPhone"

        <asp:RegularExpressionValidator ID="RegularExpressionValidator3" runat="server" Display="Dynamic"

            ControlToValidate="txtPhone" ValidationExpression="((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4}">請按照 (XXX)XXX-XXXX 格式輸入電話号碼!</asp:RegularExpressionValidator>

        郵政編碼:

        <asp:TextBox ID="txtZipCode" runat="server" Width="140px"></asp:TextBox>

        <asp:RequiredFieldValidator ID="RequiredFieldValidator4" runat="server" ControlToValidate="txtZipCode"

        <asp:RegularExpressionValidator ID="RegularExpressionValidator4" runat="server" Display="Dynamic"

            ControlToValidate="txtZipCode" ValidationExpression="^\d{5}$">郵政編碼必須是 5 個數字!</asp:RegularExpressionValidator>

        <asp:Button ID="btnOk" runat="server" Text="确定" Font-Size="Small"></asp:Button>

    </div>

RangeValidator 控件 -- 驗證使用者輸入的資料必須處于特定的範圍。需要提醒的是 Type 屬性需要設定為所需的資料類型,如果使用者的輸入值不能轉換成指定的資料類型,則驗證将失敗。

範例代碼如下所示:

        購買數量:

        <asp:TextBox ID="txtAmount" runat="server" Font-Size="12pt"></asp:TextBox>

        <asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" Display="Dynamic"

            ControlToValidate="txtAmount">必須輸入資料!</asp:RequiredFieldValidator>

        <asp:RangeValidator ID="RangeValidator2" runat="server" Display="Dynamic" ControlToValidate="txtAmount"

            Type="Integer" MaximumValue="2000" MinimumValue="100">格式不正确或購買數量不在 100 至 2000之間</asp:RangeValidator>

8. 如何禁用驗證和以程式方式來驗證ASP.NET伺服器控件

如果想禁用伺服器端和用戶端驗證,可以将單個控件的 CausesValidation 屬性設定為 false,這樣做将可以觸發回送,而不會引發驗證檢查。

如下範例代碼,将btnCancel 控件關閉驗證:

<asp:Button ID="btnCancel" runat="server" Font-Size="11pt" Text="不驗證直接傳送"

CausesValidation="False">

</asp:Button>

以程式方式來驗證ASP.NET 伺服器控件

如果希望網頁在第一次運作時,就顯示驗證控件的提示資訊,可以在網頁第一次運作時就調用網頁的 Validate 方法,因為此時各個輸入控件都是空白的,自然就不能通過驗證了。

            if (!IsPostBack)

                Page.Validate();

調用驗證控件的Validate 方法

另外一種情況時,需要在運作時才能設定驗證控件的相關屬性,是以需要在程式中手動調用驗證控件的Validate 方法。

如下範例代碼在程式中設定 RangeValidator 控件的 MinimumValue 屬性 和 MaximumValue 屬性,以及其他屬性,然後調用該驗證控件的Validate 方法:

        protected void btnSetDate_Click(object sender, EventArgs e)

            // 設定下限值

            this.AnserDateRangeValidator.MinimumValue = this.txtStartDate.Text;

            // 設定上限值

            this.AnserDateRangeValidator.MaximumValue = this.txtEndDate.Text;

            this.AnserDateRangeValidator.Type = ValidationDataType.Date;

            this.AnserDateRangeValidator.ErrorMessage = "您輸入的賣出日期必須處于買進日期與結算日期之間";

            this.AnserDateRangeValidator.Display = ValidatorDisplay.Dynamic;

            // 呼叫 Validate 方法

            this.AnserDateRangeValidator.Validate();

            // 顯示出「期貨賣出日期」文字方塊

            this.txtAnswerDate.Visible = true;

該驗證控件的頁面代碼:

<asp:RangeValidator ID="AnserDateRangeValidator" runat="server" ControlToValidate="txtAnswerDate">

</asp:RangeValidator>

繼續閱讀