使用 ASP.NET 自定义控件的邮政编码查找区号

分享于 

14分钟阅读

Web开发

  繁體

介绍

本文描述了一个简单的自定义控件的构造,用于根据选定的邮政编码查找区域代码和城市/状态位置;查找是通过使用可用的public web服务进行的。 本文包括这个定制控件的源代码以及用于测试控件的演示站点。

自定义控件包含邮政编码属性。 设置后,控件将将zip代码传递给web方法,如果邮政编码有效,则返回与zip代码关联的。 只要设置或者更改邮政编码属性,该控件就会显示邮政编码。区号和位置。

本示例包含的演示网站为更改控件的邮政编码属性以及更新控件中显示的内容提供了一个接口。 web服务通过 www.webservicex.com 插件提供,并且无需任何费用即可使用。

图 1: 使用的区域代码自定义控件

入门

包含的文件包括一个网页控制库项目和一个示范网站。 要开始,打开包含的压缩文件并将两个项目安装到你的文件系统中。 打开 IIS,并为web应用程序创建一个虚拟目录。 将解决方案打开 Visual Studio 2005并进行任何必要的更改以将两个项目都放入解决方案中。

配置好后,解决方案资源管理器应该显示这些项目,引用和文件:

图 2: 带有网络应用程序和控制库的解决方案资源管理器

在检查解决方案时,注意"areacodelookup"控件库只包含一个控件,该控件称为" AreaCodeLookup"。 这里项目还包括指向 http://www.webservicex.net 站点的web引用;这里 public 站点支持捕获用户提供的邮件和位置信息的web服务。

web应用程序只包含一个网页( Default.aspx ),并包含对"areacodelookup"dll的引用。

web应用程序用作测试自定义控件的容器;Default.aspx 页包含自定义控件的实例以及提交邮件编码的接口。

代码:AreaCodeLookup

在初始化过程中,使用自定义控件从web服务检索信息,并使用该信息填充属性集合;每个属性都设置为包含从web服务收集的值之一。

web服务以XML节点的形式返回请求的数据;这个节点被导入一个XML文档中,解析为获取用于填充成员变量的单个值。 这些成员变量依次用于在呈现页时显示区号和位置信息。

在检查代码时,注意,除了缺省导入之外,只添加了 System.XML 类。 类本身从 WebControl 类继承。

Imports SystemImports System.Collections.GenericImports System.ComponentModelImports System.TextImports System.WebImports System.Web.UIImports System.Web.UI.WebControlsImports System.Xml
<DefaultProperty("ZipCode"), _
 ToolboxData("<{0}:AreaCodeLookup runat="server">" & _ 
 "</{0}:AreaCodeLookup>")> _PublicClass AreaCodeLookup
 Inherits WebControl

在类声明之后,创建一个名为"声明"的区域,在该区域中,该区域是控件中使用的任何 private 成员变量。 在这种情况下,只有一个成员变量,因为我选择将所有属性值直接存储到视图状态。

#Region"Declarations" 
 Private mGetAreaCode As net.webservicex.www.USZip#End Region

声明变量后,定义了另一个区域,该区域是用于捕获来自web服务的数据,并读取该服务返回的XML,并使用值来填充属性。 初始化处理程序每次初始化控件时调用名为" GetAreaCode"的子例程。 GetAreaCode 以字符串的形式接受单个参数,该字符串带有邮政编码。

GetAreaCode 子例程中,创建了一个新的XML节点。 使用从调用 Web服务"GetInfoByZIP"web方法派生的返回值填充这里节点。 检查节点是否为空;如果为空,属性设置为包含提供的邮政编码无效且 GetAreaCode 子程序退出的属性。 节点为空,则创建一个XML文档,并将该节点导入该文档。 然后解析这里XML文档,并将它的值捕获到对象的属性中。 呈现控件时,属性将显示给用户。

方法区域中包含的代码如下所示:

#Region"Methods" 
 PrivateSub AreaCodeLookup_Init(ByVal sender AsObject, _
 ByVal e As System.EventArgs) HandlesMe.Init
 AreaCode = ""'get the area code for the current zip GetAreaCode(ZipCode)
 EndSubPublicSub GetAreaCode(ByVal zip AsString)
 Try mGetAreaCode = New net.webservicex.www.USZip
 Dim xn As XmlNode = mGetAreaCode.GetInfoByZIP(zip)
 If xn.HasChildNodes = FalseThen AreaCode = "XXX" ZipCode = "INVALID" City = "XXX" State = "XX"ExitSubEndIfDim xdoc AsNew XmlDocument
 xdoc.AppendChild(xdoc.ImportNode(xn, True))
 Dim wsNodes As XmlNodeList
 Dim wsNode As XmlNode
 ' get area code wsNodes = xdoc.GetElementsByTagName("AREA_CODE")
 ForEach wsNode In wsNodes
 AreaCode = wsNode.ChildNodes(0).Value
 Next' get city name wsNodes = xdoc.GetElementsByTagName("CITY")
 ForEach wsNode In wsNodes
 City = wsNode.ChildNodes(0).Value
 Next' get state name wsNodes = xdoc.GetElementsByTagName("STATE")
 ForEach wsNode In wsNodes
 State = wsNode.ChildNodes(0).Value
 NextCatch AreaCode = "XXX" ZipCode = "INVALID" City = "XXX" State = "XX"EndTryEndSub#End Region

代码中定义的下一个区域称为"属性"。 属性包含一个 public 属性的集合和三个 private 属性。 public 属性用于包含邮政编码;其他 private 属性包含区域代码。城市和状态。 所有属性值都保持在视图状态中,这些属性为:

#Region"Properties" 
 <Category("Zip Code")> _
 <Browsable(True)> _
 <Description("Enter the five number zip code.")> _
 PublicProperty ZipCode() AsStringGetDim s AsString = CStr(ViewState("ZipCode"))
 If s IsNothingThenReturnString.Empty
 ElseReturn s
 EndIfEndGetSet(ByVal Value AsString)
 ViewState("ZipCode") = Value
 EndSetEndPropertyPrivateProperty AreaCode() AsStringGetDim s AsString = CStr(ViewState("AreaCode"))
 If s IsNothingThenReturnString.Empty
 ElseReturn s
 EndIfEndGetSet(ByVal Value AsString)
 ViewState("AreaCode") = Value
 EndSetEndPropertyPrivateProperty City() AsStringGetDim s AsString = CStr(ViewState("City"))
 If s IsNothingThenReturnString.Empty
 ElseReturn s
 EndIfEndGetSet(ByVal Value AsString)
 ViewState("City") = Value
 EndSetEndPropertyPrivateProperty State() AsStringGetDim s AsString = CStr(ViewState("State"))
 If s IsNothingThenReturnString.Empty
 ElseReturn s
 EndIfEndGetSet(ByVal Value AsString)
 ViewState("State") = Value
 EndSetEndProperty#End Region

类别。可以浏览和描述的属性用于为自定义控件提供设计时支持。 当开发人员使用控件选择这里控件时,将在ide编辑器的属性中显示类别和说明文本。

从web服务返回的XML字符串中获取值,并使用XML中包含的值填充属性,唯一的步骤是。 名为"呈现"的区域,它跟随并包含在页面上呈现控件所需的代码。

用来呈现控件的代码相当简单;HtmlTextWriter 用于定义表并设置它的特征,表的每一行包含两个单元格,每个单元格中都放置一个标签和相应值。 CityState 属性组合成一个 Location 字符串,并显示在标签读取"位置"旁边。 一旦所有数据都写入到 table 中,就会呈现结束标记,并且控件完成。

自然,你可以更改 table的配置,或者通过在 HtmlTextWriter 中定义的HTML定义来删除从web服务返回的数据。 如果可以访问性是问题,你可能希望根据"div"的用户来呈现该控件,而不是使用 table。 渲染操作被包装在 尝试捕获 block ;如果呈现操作失败,则捕获 block 将显示一些占位符文本。 通过使用 HtmlTextWriter,重写 RenderContents 子例程并在这个子例程中格式化 HTML。

#Region"Rendering" 
 ProtectedOverridesSub RenderContents(ByVal _
 output As HtmlTextWriter)
 Try output.AddAttribute(HtmlTextWriterAttribute.Cellpadding, "3")
 output.RenderBeginTag(HtmlTextWriterTag.Table)
 output.RenderBeginTag(HtmlTextWriterTag.Tr)
 output.AddAttribute(HtmlTextWriterAttribute.Align, "left")
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write("<b>Zip Code: </b>")
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write(ZipCode)
 output.RenderEndTag()
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Tr)
 output.RenderBeginTag(HtmlTextWriterTag.Tr)
 output.AddAttribute(HtmlTextWriterAttribute.Align, "left")
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write("<b>Area Code: </b>")
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write(AreaCode)
 output.RenderEndTag()
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Tr)
 output.AddAttribute(HtmlTextWriterAttribute.Align, "left")
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write("<b>Location: </b>")
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Td)
 output.Write(City & "," & State)
 output.RenderEndTag()
 output.RenderEndTag()
 output.RenderBeginTag(HtmlTextWriterTag.Tr)
 output.RenderBeginTag(HtmlTextWriterTag.Tr)
 output.RenderEndTag()
 output.RenderEndTag()
 Catch ex As Exception
 output.Write("Area Code From Zip")
 EndTryEndSub#End Region

代码:站点页面的演示默认

演示站点中包含的Default.aspx 页面只为控件提供一个测试容器。 页面包含用于标题的Label 控件。用于捕获邮政编码的文本框以及用于提交请求的按钮。 可以在IDE中使用属性编辑器设置zip代码属性,或者在is事件处理程序中指定zip代码属性。

图 3: 在设计时设置邮政编码属性

处理程序的按钮单击事件代码如下所示:

ProtectedSub btnLookup_Click(ByVal sender AsObject, _
 ByVal e As System.EventArgs) _
 Handles btnLookup.Click
 IfNotString.IsNullOrEmpty(txtZip.Text.ToString()) ThenTryDim chr() AsChar = txtZip.Text.ToCharArray()
 Dim iLoop AsIntegerFor iLoop = 0To chr.Length - 1IfChar.IsLetter(chr(iLoop)) Then txtZip.Text = "INVALID"ExitSubEndIfNext AreaCodeLookup1.ZipCode = txtZip.Text
 AreaCodeLookup1.GetAreaCode(txtZip.Text)
 Catch ex As Exception
 EndTryEndIfEndSub

图 4: 输入无效的邮政编码后

处理程序非常直接,用来捕获邮政编码的文本框的内容首先被检查,以确保它不是空的。 如果不是空的,则检查内容以确保值不包含字符。 如果遇到字符,则文本框文本设置为显示无效,并且事件处理程序子程序已经退出。 如果文本框包含有效项,则设置控制代码属性的自定义 zip,然后用文本框的文本值调用 GetAreaCode

自定义控件将通过web服务更新面积代码,城市和状态值,通过控件显示在页面上。

摘要

这里项目旨在描述一个有用的。易于构建的自定义控件。 虽然这里演示仅限于描述 AreaCodeLookup 自定义控件,但这里应用的方法将适用于各种其他自定义控件。 项目本身描述了一些可以用于通过自定义控件与web服务通信的过程。


cod  控制  asp  asp-net  custom-control  ZIP