Fork me on GitHub

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

只有实现了 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 服务器控件。
            Literal MyLiteral2 = new Literal();

            // 要求使用 HtmlEnocde 方法来编码 Text 属性的内容。
            MyLiteral2.Mode = LiteralMode.Encode;

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

            // 将 Literal 服务器控件动态加入 Panel 容器中。
            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>
        <br />
        请输入上限:
        <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=" http://([\w-]+\.)+[\w-]+(/[\w- ./?%&amp;=]*)?">请输入格式正确的网址!</asp:RegularExpressionValidator>
        <br />
        电子邮件:
        <asp:TextBox ID="txtEmail" runat="server" Width="284px"></asp:TextBox>
        <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ControlToValidate="txtEmail"
            Display="Dynamic">必须输入数据,不可以空白!</asp:RequiredFieldValidator>
        <asp:RegularExpressionValidator ID="RegularExpressionValidator2" runat="server" Display="Dynamic"
            ControlToValidate="txtEmail" ValidationExpression="^[\w-]+@[\w-]+\.(com|net|org|edu|mil)$">请输入格式正确的电子邮件!</asp:RegularExpressionValidator>
        <br />
        市内电话:
        <asp:TextBox ID="txtPhone" runat="server" Width="236px"></asp:TextBox>
        <asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" ControlToValidate="txtPhone"
            Display="Dynamic">必须输入数据,不可以空白!</asp:RequiredFieldValidator>
        <asp:RegularExpressionValidator ID="RegularExpressionValidator3" runat="server" Display="Dynamic"
            ControlToValidate="txtPhone" ValidationExpression="((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4}">请按照 (XXX)XXX-XXXX 格式输入电话号码!</asp:RegularExpressionValidator>
        <br />
        邮政编码:
        <asp:TextBox ID="txtZipCode" runat="server" Width="140px"></asp:TextBox>
        <asp:RequiredFieldValidator ID="RequiredFieldValidator4" runat="server" ControlToValidate="txtZipCode"
            Display="Dynamic">必须输入数据,不可以空白!</asp:RequiredFieldValidator>
        <asp:RegularExpressionValidator ID="RegularExpressionValidator4" runat="server" Display="Dynamic"
            ControlToValidate="txtZipCode" ValidationExpression="^\d{5}$">邮政编码必须是 5 个数字!</asp:RegularExpressionValidator>
        <br />
        <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 方法,因为此时各个输入控件都是空白的,自然就不能通过验证了。

范例代码如下所示:
        protected void Page_Load(object sender, EventArgs e)
        {
            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>
posted @ 2011-09-08 01:00  _落雨  阅读(168)  评论(0编辑  收藏  举报