天天看点

【转】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>