ASP.NET教程之利用Web尺度天生ASP.NET 2.0 Web站点
有时也搞不懂应该学那种;主要看你以后去的那个公司是使用哪种了。就像王千祥的课上说的:企业应用现在主要就三层(其实也差不多就是MVC):表示层(主要使用html写的,很简单)、业务逻辑层(主要就是应用服务器的)。最后就是数据层(其实就是学习数据库)asp.net|web|web尺度|站点简介Web尺度使您能经由过程起码的事情,天生可被最宽大受众会见的Web站点。Web尺度的答应是:只需计划页面一次,便可让该页以完整不异的体例在任何古代的扫瞄器中显现和事情。比方,在依照尺度天生今后,旨在在MicrosoftInternetExplorer中以某种体例显现的页可在其他扫瞄器(如,MozillaFirefox、NetscapeNavigator、Opera、Camino和Safari)中以不异的体例显现,而无需完成任何分外的事情。
Web尺度的一个分外优点是―使Web站点更容易于为残疾人士会见。这是一个局限普遍的受众群体,包含目力阑珊的中年人士,方才在滑雪时跌断胳膊的人士,和完整掉明的人士等。利用尺度可制止偶然中制止那些具有临时性或永世性身材残疾的人士会见Web页。
关于天生满意大众Web尺度的Web站点而言,MicrosoftASP.NET2.0框架是最好的框架。出格夸大的是,ASP.NET2.0框架中的每一个控件都依照XHTML和可会见性尺度举行了周全的反省和测试。别的,MicrosoftVisualStudio.NET2005还包括一些新工具,用于依照XHTML和可会见性尺度考证Web页。
本文的目标是为您供应有关XHTML和可会见性尺度的概述,并申明怎样使用ASP.NET2.0和VisualStudio.NET2005来满意这些尺度。在本文的开头,将分步练习训练以下功效,即创立可以同时满意XHTML和可会见性尺度的ASP.NET2.0Web站点。
天生XHTMLWeb站点
HTML在正式的场所已过期了。WorldWideWebConsortium(W3C)于2000年6月26日公布了XHTML的第一个版本作为保举尺度。XHTML尺度的方针是代替HTML。依照W3C的说法,“XHTML是HTML的承继者”(http://www.w3.org/MarkUp/)。
XHTML尺度的制订者具有两年夜方针:
•在文档布局和暗示情势之间创立更分明的分别。
•将HTML从头暗示为XML的使用程序。
为了完成第一个方针,W3C一向在刚强地从HTML中删除地道形貌性的元素和属性(他们是从HTML4.0入手下手这一历程的)。比方,XHTML1.0Strict不包括诸如标志之类的元素或诸如bgcolor属性之类的属性,由于这些元素和属性完整用于形貌文档的表面,它们与文档的布局没有任何干系。
W3C一向在勉力使Web站点计划职员和开辟职员摒弃特定标志应该具有特定表面这一看法。比方,您大概会以为标志(题目标志)的用处是在页中出现年夜的加粗文本。这实践上是错的。标志用来在文档中标志题目而不是其他任何器材。怎样出现题目标志由扫瞄器断定。目力阑珊的人士利用的屏幕浏览器大概使用平铺直叙的声响来高声朗诵题目标志的内容。不撑持多个字体巨细的PDA大概用闪灼文本出现题目标志的内容。您不该当试图利用诸如标志之类的页元从来把持Web页的表面。相反,您应该经由过程利用层叠款式表来唆使Web页的表面。并且,您所利用的层叠款式表应该是内部层叠款式表。请利用标志和属性来标志文档的布局,而利用款式表来把持文档的暗示情势。
XHTML的第二个方针是迫使HTML开辟职员恪守更加严厉的XML划定规矩。依照W3C的说法,“XHTML1.0是HTML4.01的作为XML1.0使用程序的订正”(http://www.w3.org/MarkUp/)。换句话说,利用XHTML天生Web页时,实践上是在创立XML文档。
XML文档具有比HTML文档更严厉的语法。比方,XML辨别巨细写,一切XML属性都必需放在引号内,并且XML标志不克不及堆叠。强制Web站点开辟职员和计划职员恪守有更高请求的言语划定规矩有良多优点。
优点之一,用XHTML标志编写的页具有更高的跨扫瞄器、跨设备和跨操纵体系兼容性。假如在扫瞄器中翻开传统的HTML页,扫瞄器将想方设法地出现该页。扫瞄器将试图出现该页,即便您的HTML一团糟。比方,InternetExplorer(和Firefox和Opera)可以很好地显现上面的HTML页。
thisisboldanditalicandthisisbold
InternetExplorer会得当地显现该页―即便该页短少和入手下手标志,标志不具有婚配的停止标志,而且入手下手和停止标志的巨细写纷歧致。一切次要的扫瞄器都能顺应几近任何HTML标志“夹杂物”,而且不顾地出现一些内容。
扫瞄器的这类顺应举动是伤害的,由于分歧的扫瞄器(或不异扫瞄器的未来版本,或在分歧操纵体系上运转的不异扫瞄器)大概以分歧体例出现庞杂的HTML。实践上,关于最新版本的InternetExplorer、MozillaFirefox和Opera而言,它们出现有效HTML的体例惊人地分歧。可是,一旦入手下手违背游戏划定规矩,就不会失掉任何包管。
但是,假如用XHTML的更严厉的划定规矩编写Web页,那末Web页就更有大概以分歧的体例与以后扫瞄器合作,而且它们将持续与以后扫瞄器的将来新版本合作。关于任何公司而言,几近都不具有针对每一个扫瞄器、在每一个操纵体系和每一个设备上测试其Web站点的资本。假如依照Web尺度编写页面,那末就不用具有如许的资本。
XHTML尺度的版本
有三个版本的XHTML1.0,它们分离对应三个版本的HTML4.01:
•XHTML1.0Transitional
•XHTML1.0Strict
•XHTML1.0Frameset
XHTML1.0Transitional包括HTML4.01Transitional中的全体标志和属性。引进XHTML1.0Transitional尺度的目标是,使现有HTML计划职员和开辟职员无需履历太多的疾苦就可以迁徙到XHTML。
XHTML1.0Strict与XHTML1.0Transitional的分歧的地方在于,它在文档布局和暗示情势之间实行了一种更加分明的分别。与XHTML1.0Transitional分歧,XHTML1.0Strict强制您利用层叠款式表来把持页的表面。
XHTML1.0Frameset文档意在成为利用标志将扫瞄器分别为多个框架的文档(XHTML1.0Transitional和Strict页不克不及包括标志)。
W3C还公布了XHTML1.1以作为保举尺度(2001年5月31日)。XHTML1.1十分相似于XHTML1.0Strict。两者的次要区分在于,能够用附加模块扩大XHTML1.1以便撑持新元素。比方,能够天生特定的XHTML1.1页,该页还包括MathML(数学标志言语)、SVG(可伸缩向量言语)或创立的自界说模块中的元素。
最初,W3C正在制定XHTML2.0保举尺度。由于XHTML2.0仍旧处于草拟阶段,而且以后没有Web扫瞄器撑持该尺度,以是我们不在本文会商它。
ASP.NET2.0框架和VisualStudio.NET2005面向XHTML1.0Transitional。该尺度是XHTML尺度中限定性最低的,并且它是与现有HTML页最兼容的尺度。可是,还能够天生面向XHTML1.0Strict尺度乃至XHTML1.1尺度的ASP.NET2.0页(请参阅前面的“设置XHTML分歧性”一节)。
(请注重,默许情形下,ASP.NET框架的Beta2版本面向XHTML1.1。ASP.NET2.0框架的终极版本将面向XHTML1.0Transitional。)
创立XHTML页
与HTML页分歧,XHTML页必需是尺度格局且无效的XML文档。XHTML1.0保举尺度的第4部分对HTML和XHTML之间的区分举行了总结。这里给出身成无效XHTML页的最主要需求的列表:
•页必需包括无效的XHTMLDOCTYPE。
无效的XHTML页必需在其任何内容之前包括一个XHTMLDOCTYPE。当在VisualStudio.NET2005或MicrosoftVisualWebDeveloper中创立新的ASP.NET页时,该页中将主动包括XHTML1.0Transitional的准确的DOCTYPE。上面列出四个尺度的XHTMLDOCTYPE:
XHTML1.0Transitional
XHTML1.0Strict
XHTML1.0Frameset
XHTML1.1
向页中增加DOCTYPE会影响该页在扫瞄器中的出现体例。请参阅以下题目为“XHTML和DOCTYPE切换”的一节。
•根元素必需援用XHTML定名空间。
XHTML页的入手下手标志必需指定默许定名空间http://www.w3.org/1999/xhtml。以下是XHTML1.0Transitional页的无效入手下手标志的示例:
•一切元素和属性名都必需小写。
XML辨别巨细写。因而,在
标志和
标志之间存在差别。只要前者是无效的XHTML段落标志。
•属性值必需一直放在引号内。
确保一直将属性值放在双引号或单引号中。比方,以下是有效的XHTML。
Next
在该示例中,href属性短少引号。以下代码是无效的XHTML。
Next
您能够经由过程选择菜单选项Tools、Options、Format,将VisualStudio.NET2005和VisualWebDeveloper设置为主动将属性值放在引号内。
一切具有入手下手标志的非空元素都必需具有婚配的停止标志。
假如具有入手下手标志,则必需包括停止标志来标志段落的停止。关于基本不包括任何内容的标志,比方标志,可同时供应入手下手和停止标志,也能够利用空元素简写。
为使XHTML页与现有的HTML扫瞄器向后兼容,必要当心处置翻开和封闭标志的体例。比方,现有HTML扫瞄器偏向于将入手下手和停止
标志毛病地注释为两个
元素。因而,您应该利用空元素简写
。
别的,除非您当心地在停止斜杠之前增加一个空格,不然现有HTML扫瞄器在处置空元素简写时会呈现成绩。因而,应该利用/>(而不是)向页中增加
元素。
•不得存在堆叠标志。
可使标志嵌套,可是不同意使标志堆叠。比方,以下XHTML是无效的。
Thisisboldanditalic
可是,以下XHTML是有效的。
Thisisboldanditalic
•不得存在属性最简化。
一切属性都必需具有值,即便该值看起来有一点儿奇异。比方,标志是有效的XHTML,由于checked属性不具有值。该标志应该写成。
•必需利用id属性而不是name属性。
在HTML中,可使用name属性来标识
清单6中的页包括一个更庞大版本的Boston地铁工夫表,它同时利用了headers和axis属性(拜见)。
.庞大的地铁工夫表
清单6.Subway.aspx
<%@PageLanguage="VB"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<headrunat="server">
<title>RedLineSubwaySchedule</title>
<styletype="text/css">
caption{color:white;background-color:red;font-size:xx-large}
table{width:500px;border-collapse:collapse}
td,th{padding:5px}
td{border:1pxsolidblack}
tbodyth{text-align:right}
.headerRowth{font-size:x-large;text-align:left}
</style>
</head>
<body>
<formid="form1"runat="server">
<div>
<table
summary="Thistablecontainsthescheduleoftrain
departuresfortheRedLine">
<caption>RedLineSchedule</caption>
<thead>
<tr>
<th></th>
<thid="hdrFirstTrain"axis="train">FirstTrain</th>
<thid="hdrLastTrain"axis="train">LastTrain</th>
</tr>
</thead>
<tbody>
<trclass="headerRow">
<thid="hdrWeekday"axis="day"colspan="3">Weekday</th>
</tr>
<tr>
<thid="hdrAlewife1"axis="location">Alewife</th>
<tdheaders="hdrAlwife1hdrWeekdayhdrFirstTrain">5:24am</td>
<tdheaders="hdrAlwife1hdrWeekdayhdrLastTrain">12:15am</td>
</tr>
<tr>
<thid="hdrBraintree1"axis="location">Braintree</th>
<tdheaders="hdrBraintree1hdrWeekdayhdrFirstTrain">5:15am</td>
<tdheaders="hdrBraintree1hdrWeekdayhdrLastTrain">12:18am</td>
</tr>
<trclass="headerRow">
<thid="hdrSaturday"axis="day"colspan="3">Saturday</th>
</tr>
<tr>
<thid="hdrAlewife2"axis="location">Alewife</th>
<tdheaders="hdrAlewife2hdrSaturdayhdrFirstTrain">8:24am</td>
<tdheaders="hdrAlewife2hdrSaturdayhdrLastTrain">11:15pm</td>
</tr>
<tr>
<thid="hdrBraintree2"axis="location">Braintree</th>
<td
headers="hdrBraintree2hdrSaturdayhdrFirstTrain">7:16am</td>
<td
headers="hdrBraintree2hdrSaturdayhdrLastTrain">10:18pm</td>
</tr>
</tbody>
</table>
</div>
</form>
</body>
</html>
请注重,每一个表单位格都包括headers属性。headers属性暗示与列和行题目绝对应的ID的空格分开列表。地铁工夫表中的每一个单位格都具有相干联的地位、日期和列车题目。
同时,请注重,每一个<th>标志都具有一个axis属性,用于暗示与题目相干联的种别。比方,Weekday和Saturday题目都与day轴相干联。FirstTrain和LastTrain题目与train轴相干联。
最初,请注重清单6中的表同时包括summary属性和标志。summary属性的事情体例十分相似于alt属性。您可使用summary属性供应扫瞄器未出现的表的申明。另外一方面,扫瞄器出现标志的内容。您应该利用标志来标识表的用处。
假如利用ASP.NET2.0GridView或DetailsView控件来显现HTML表中的数据库数据,则默许情形下,天生的HTML表是可会见的。比方,清单7包括一个ASP.NET页,它经由过程利用GridView控件来显现Titles数据库表的内容。
清单7.DisplayTitles.aspx
<%@PageLanguage="VB"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<headrunat="server">
<title>DisplayTitles</title>
</head>
<body>
<formid="form1"runat="server">
<div>
<asp:GridView
id="grdTitles"
DataSourceId="srcTitles"
Runat="server"/>
<asp:SqlDataSource
id="srcTitles"
ConnectionString=
"Server=localhost;Trusted_Connection=true;Database=Pubs"
SelectCommand="Select*FROMTitles"
Runat="server"/>
</div>
</form>
</body>
</html>
在清单7中,GridView控件被绑定到一个暗示Titles数据库表中纪录的SqlDataSource控件。在扫瞄器中翻开清单7中的ASP.NET页时,Titles数据库表的内容显现在HTML表中(拜见0)。
0.DisplayTitles.aspx
请注重,GridView控件主动为每一个列题目天生<th>标志。并且,假如在扫瞄器当选择ViewSource,则能够看到为每一个列题目主动天生scope="col"属性。
GridView控件撑持其他多个与可会见性相干的属性:
Caption和CaptionAlign―利用这些属性能够向GridView控件天生的HTML表中增加题目。
RowHeaderColumn―利用该属性能够唆使行题目(相对列题目而言)。请将该属性设置为从数据源前往的列的称号(比方,title_id)。
UseAccessibleHeader―利用该属性能够唆使是不是应该用或<td>标志出现列题目。默许情形下,该属性具有值true.
请注重,GridView控件不具有Summary属性。可是,像年夜多半ASP.NET控件一样,GridView控件撑持expando属性。当您声明GridView控件时,您能够声明喜好的任何属性,而该属性将被出现到扫瞄器中。因而,假如您但愿向GridView中增加择要,则请按以下体例声明summary属性。
<asp:GridView
id="grdTitles"
DataSourceId="srcTitles"
summary="DisplaysthecontentsoftheTitlesdatabasetable"
Runat="server"/>
GridView控件的默许举动十分合适于以可会见的体例显现复杂数据表。可是,假如您必要显现更加庞大的表(比方,一组嵌套表),则您必需完成分外的事情。
比方,您大概但愿显现产物种别的列表,而且但愿在每一个种别下显现婚配产物的列表。换句话说,您但愿创立单页“次要信息/具体信息”表单(拜见1)。在这类情形下,必要为每一个表单位格包括headers属性。
1.嵌套Repeater控件
清单8中的页申明怎样将一个Repeater控件嵌套到另外一个Repeater控件中,和怎样天生切合可会见性原则请求的庞大表。
清单8.NestedRepeaters.aspx
<%@PageLanguage="VB"%>
<%@ImportNamespace="System.Data"%>
<%@ImportNamespace="System.Data.SqlClient"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<scriptrunat="server">
PrivatedtblProductsAsNewDataTable
SubPage_Load()
DimdadAsNewSqlDataAdapter("SELECT*FROMPRODUCTS",_
"Server=localhost;Trusted_Connection=true;Database=Northwind")
dad.Fill(dtblProducts)
EndSub
FunctionGetProducts(ByValCategoryIDAsInteger)AsDataView
DimviewAsDataView=dtblProducts.DefaultView
view.RowFilter="CategoryID="&CategoryID
Returnview
EndFunction
FunctionGetCategoryHeader(ByValindexAsInteger)AsString
Return"hdrCategory"&index.ToString()
EndFunction
FunctionGetProductHeader(ByValproductIDAsInteger)AsString
Return"hdrProduct"&productID.ToString()
EndFunction
FunctionGetHeaders(ByValitemAsRepeaterItem,_
ByValcolumnHeaderAsString)AsString
DimparentAsRepeaterItem=_
item.NamingContainer.NamingContainer
DimcategoryHeaderAsString=_
GetCategoryHeader(parent.ItemIndex)
DimproductHeaderAsString=_
GetProductHeader(item.DataItem("ProductID"))
ReturnString.Format("{0}{1}{2}",categoryHeader,_
productHeader,columnHeader)
EndFunction
</script>
<htmlxmlns="http://www.w3.org/1999/xhtml">
<headrunat="server">
<title>UntitledPage</title>
<styletype="text/css">
.categoryRow{background-color:yellow}
</style>
</head>
<body>
<formid="form1"runat="server">
<div>
<asp:Repeater
id="grdCategories"
DataSourceId="srcCategories"
Runat="server">
<HeaderTemplate>
<table>
<thead>
<thid="hdrID">ID</th>
<thid="hdrName">Name</th>
<thid="hdrPrice">Price</th>
</thead>
<tbody>
</HeaderTemplate>
<ItemTemplate>
<trclass="categoryRow">
<thcolspan="3"
id=<%#GetCategoryHeader(Container.ItemIndex)%>>
<%#Eval("CategoryName")%>
</th>
</tr>
<asp:Repeater
id="grdProducts"
DataSource=<%#GetProducts(Eval("CategoryID"))%>
Runat="server">
<ItemTemplate>
<tr>
<th
id=<%#GetProductHeader(Eval("ProductID"))%>>
<%#Eval("ProductID")%>
</th>
<td
headers=<%#GetHeaders(Container,"hdrName")%>>
<%#Eval("ProductName")%>
</td>
<tdheaders=
<%#GetHeaders(Container,"hdrPrice")%>>
<%#Eval("UnitPrice","{0:c}")%>
</td>
</tr>
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
<FooterTemplate>
</tbody>
</table>
</FooterTemplate>
</asp:Repeater>
<asp:SqlDataSource
id="srcCategories"
ConnectionString=
"Server=localhost;Trusted_Connection=true;Database=Northwind"
SelectCommand="SELECT*FROMCategories"
Runat="server"/>
</div>
</form>
</body>
</html>
在清单8中,外层的Repeater控件用来列生产品种别,而内层的Repeater控件用来列出婚配产物。以下两个Helper函数用来天生CategoryName和ProductID题目的id值:GetProductHeader和GetCategoryHeader函数。别的一个独自的名为GetHeaders的Helper函数用来天生用于headers属性的值。
清单8中的ASP.NET页天生以下所示的HTML表。
<table>
<thead>
<thid="hdrID">ID</th>
<thid="hdrName">Name</th>
<thid="hdrPrice">Price</th>
</thead>
<tbody>
<trclass="categoryRow">
<thcolspan="3"id=hdrCategory0>
Beverages
</th>
</tr>
<tr>
<thid=hdrProduct1>
1
</th>
<tdheaders=hdrCategory0hdrProduct1hdrName>
Chai2
</td>
<tdheaders=hdrCategory0hdrProduct1hdrPrice>
$18.55
</td>
</tr>
<tr>
<thid=hdrProduct2>
2
</th>
<tdheaders=hdrCategory0hdrProduct2hdrName>
Chang
</td>
<tdheaders=hdrCategory0hdrProduct2hdrPrice>
$19.00
</td>
</tr>
....remainderofthetable
请注重,每一个<td>标志都包括得当的headers属性。
创立可会见的XHTML
良多可会见性原则共有的一个主题是如许一个观点―即,Web页应该切合尺度,如许才干成为可会见的页。依照原则,您应该勉力利用最新的W3C尺度(比方,最新版本的XHTML和层叠款式表)来天生Web站点。
出格必要指出的是,在计划Web页时,您应该将文档的布局与它的暗示情势分隔。请利用标志来暗示Web页的布局,而且利用层叠款式表来把持Web页的表面。
比方,毫不要仅仅利用<blockquote>元从来缩进文本块。<blockquote>元素的用处是创立原文的引文。假如您但愿缩进文本,则应该改而利用层叠款式表margin属性。
您还应该只在暗示数据表时利用<table>标志。只管利用<table>标志来对Web页面举行结构在以后是一种罕见的做法,可是,请尽量改而利用<div>标志。比方,清单9中的页具有三列式结构,可是不包括一个<table>标志(拜见2)。
2.不含表的页结构
清单9.Tableless.aspx
<%@PageLanguage="VB"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<headrunat="server">
<title>TablelessLayout</title>
<styletype="text/css">
#content
{
margin-left:auto;
margin-right:auto;
width:800px;
}
#leftColumn
{
float:left;
width:150px;
border:1pxsolidblack;
padding:10px;
}
#middleColumn
{
float:left;
width:430px;
padding:10px;
}
#rightColumn
{
float:right;
width:150px;
border:1pxsolidblack;
padding:10px;
}
</style>
</head>
<body>
<formid="form1"runat="server">
<divid="content">
<divid="leftColumn">
Leftcolumncontents...
Leftcolumncontents...
Leftcolumncontents...
Leftcolumncontents...
Leftcolumncontents...
Leftcolumncontents...
Leftcolumncontents...
Leftcolumncontents...
Leftcolumncontents...
Leftcolumncontents...
</div>
<divid="middleColumn">
Middlecolumncontents...
Middlecolumncontents...
Middlecolumncontents...
Middlecolumncontents...
Middlecolumncontents...
Middlecolumncontents...
Middlecolumncontents...
Middlecolumncontents...
Middlecolumncontents...
</div>
<divid="rightColumn">
Rightcolumncontents...
Rightcolumncontents...
Rightcolumncontents...
Rightcolumncontents...
Rightcolumncontents...
Rightcolumncontents...
Rightcolumncontents...
Rightcolumncontents...
</div>
</div>
</form>
</body>
</html>
清单9中的页包括四个<div>标志。第一个<div>标志(名为content)用来指定页的内容地区的宽度。其他三个<div>标志(分离名为left、middle和right)将内容地区分别为三列。该页能够在InternetExplorer6、Firefox和Opera8中准确显现(要检察一些不利用HTML表创立结构的真正大度的页面,请拜见http://csszengarden.com.)
WCAG原则以为,不成能老是制止利用<table>标志来创立页结构,由于较旧的扫瞄器不完整撑持层叠款式表尺度(请参阅WCAG原则5)。在没法制止利用表创立结构的情形下,您应当确认这些表的内容在举行线性化(即,依照表-单位格按次来浏览)时是成心义的。
由于ASP.NET框架必需与新式和旧式扫瞄器同时兼容,以是一些ASP.NET控件实践上的确利用<table>标志来创立结构。比方,ASP.NET2.0Login控件利用<table>标志来把持用户名和暗码输出字段的结构。
创立可会见的剧本
WCAG和508节原则中包括的一个十分严厉的限定与客户端剧本有关。依据WCAG1.0原则中的优先级1反省点,请求:
6.3确保页在剧本、小程序或其他编程工具封闭或不受撑持时是可用的。假如这是不成能的,请在可会见的交换页中供应等效信息。[优先级1]
508节原则包括相似的请求:
(l)当页使用剧本言语来显现内容大概创立界面元素时,应当用可经由过程帮助性手艺浏览的功效性文本标识由该剧本供应的信息。
成绩在于,多个ASP.NET控件请求具有客户端JavaScript才干一般事情。这方面的次要示例是ASP.NETLinkButton控件。LinkButton控件利用JavaScript将包括该控件的表单提交给Web服务器。
该成绩没有很好的办理计划。假如必要天生可以满意一切可会见性原则的Web站点,则必要十分当心地利用客户端剧本。您大概必要制止利用某些依附于JavaScript的ASP.NET控件,比方LinkButton控件。
遗憾的是,在天生古代Web站点时,很难恪守该原则。这类假定仿佛使得Web站点更像杂志而不是使用程序。古代Web站点偏向于包括静态的客户端内容。比方,良多房地产Web站点包括一个JavaScript按揭盘算器。人们尚不分明JavaScript按揭盘算器的文本等效物应当是甚么。
考证页的可会见性
与存在XHTML的完整主动化考证程序分歧,其实不存在完整主动化的可会见性考证程序。之以是不存在可会见性的主动化考证程序,缘故原由在于判别页的可会见性必要野生注释。
比方,为了使Web页可会见,该页中的每一个图象都必需包括成心义的交换文本。今朝,没有任何盘算性能够断定一段文本是不是具有与图象不异的寄义。可会见性考证程序最多只能供应应当反省的事物的列表。
VisualStudio.NET2005(但不是VisualWebDeveloper)包括可会见性反省器。可从工具栏中翻开可会见性反省器。还可经由过程选择菜单选项Tools、CheckAccessibility来翻开它(拜见3)。
3.VisualStudio.NET2005可会见性反省器
可会见性反省器供应了用于依照WCAG优先级1反省点、WCAG优先级2反省点或508节原则考证Web站点的选项。能够经由过程翻开“ErrorList”(顺次选择菜单选项View、OtherWindows、ErrorList)来检察Web站点的考证了局。
VisualStudio.NET2005可会见性反省器还供应显现可会见性成绩的“手动反省列表”的选项。假如选择该选项,则每当考证Web站点的可会见性时,城市在ErrorList窗口中显现不异的可会见性成绩静态列表。该反省列表包括没法经由过程可会见性反省器主动考证的成绩。
假如利用VisualWebDeveloper天生Web站点,则还能够反省Web页的可会见性。为此,必要利用某个联机可会见性反省器。上面的链接指向两个最盛行的联机可会见性反省器:
Bobby
WAVE
示例使用程序:可会见的XHTMLASP.NETWeb站点
在最初一节中,我们将从头至尾完全地天生一个ASP.NET2.0Web站点。本白皮书随附有该示例Web站点的源代码。您能够下载该示例Web站点的源代码,而且在VisualWebDeveloper或VisualStudio.NET2005中翻开该Web站点。
我们的方针是创立一个完整切合尺度的Web站点。该Web站点将经由过程XHTML1.0Strict(乃至XHTML1.1)考证。并且,该Web站点还可供残疾人士会见。它将同时满意508节和WCAG(优先级1和优先级2)可会见性请求。
我们将天生一个名为SuperSuperBookstoreWeb站点的网上书店。我们将经由过程Amazon电子商务Web服务检索书店的一切书本清单。Amazon电子商务Web服务为我们供应了充足的收费示例数据,以供我们举行练习训练(有关AmazonWeb服务的具体信息,请参阅http://www.amazon.com/gp/aws/landing.html)。
为复杂起见,我们的Web站点仅由两个ASP.NET页构成:
Default.aspx―该页显现指定种别中的书本的列表。
Search.aspx―该页使您可以搜刮满意特定搜刮前提的一切书本。
在幕后,该Web站点利用了ASP.NET2.0框架的多项新功效。比方,该Web站点利用了一个母版页来创立大众页结构,而且利用了一个主题来创立大众页款式。最初,示例站点利用新的GridView和ObjectDataSource控件举行数据会见。
会见AmazonWeb服务
SuperSuperBookstore利用一个名为Amazon的大众类来针对Amazon书目检索书本信息并实行搜刮。该类包括在清单10中。
清单10.Amazon.vb
ImportsMicrosoft.VisualBasic
PublicClassAmazon
ConstSubscriptionIdAsString="1CD1NYF3YQ830DG7AM02"
Attemptstogetbooksincategoryfromcache.
Ifnotincache,callAmazonWebservice
PublicFunctionGetBooks(ByValCategoryIdAsString)_
AsAmazonServices.Item()
DimcontextAsHttpContext=HttpContext.Current
DimBooksAsAmazonServices.Item()
IfIsNothing(context.Cache(CategoryId))Then
Books=GetBooksFromAmazon(CategoryId)
context.Cache(CategoryId)=Books
Else
Books=CType(context.Cache(CategoryId),_
AmazonServices.Item())
EndIf
ReturnBooks
EndFunction
RetrievesbooksincertaincategoryfromWebservice
PublicFunctionGetBooksFromAmazon(ByValCategoryIdAsString)_
AsAmazonServices.Item()
DimserviceAsNewAmazonServices.AWSECommerceService()
InitializeRequest
DimsearchRequestAsNewAmazonServices.ItemSearchRequest
WithsearchRequest
.SearchIndex="Books"
.Sort="salesrank"
.ResponseGroup=NewString(){"Medium"}
.BrowseNode=CategoryId
EndWith
DimsearchAsNewAmazonServices.ItemSearch
Withsearch
.SubscriptionId=SubscriptionId
.Request=NewAmazonServices.ItemSearchRequest()_
{searchRequest}
EndWith
GetResponse
DimresponseAsAmazonServices.ItemSearchResponse=Nothing
Try
service.Timeout=5000
response=service.ItemSearch(search)
Catch
EndTry
IfIsNothing(response)Then
ReturnNothing
EndIf
Returnresponse.Items(0).Item
EndFunction
SearchesforbooksbycallingAmazonWebservice
PublicFunctionSearchBooksFromAmazon(ByValAuthorAsString,_
ByValTitleAsString,ByValKeywordsAsString,_
ByValPowerSearchAsString)AsAmazonServices.Item()
Dontsearchifnothingtosearchfor
IfIsNothing(PowerSearch)AndIsNothing(Author)And_
IsNothing(Title)AndIsNothing(Keywords)Then
ReturnNothing
EndIf
InitializeRequest
DimserviceAsNewAmazonServices.AWSECommerceService()
DimsearchRequestAsNewAmazonServices.ItemSearchRequest
WithsearchRequest
.SearchIndex="Books"
.ResponseGroup=NewString(){"Medium"}
IfNotIsNothing(PowerSearch)Then
.Power=PowerSearch
Else
IfNotIsNothing(Author)Then
.Author=Author
EndIf
IfNotIsNothing(Title)Then
.Title=Title
EndIf
IfNotIsNothing(Keywords)Then
.Keywords=Keywords
EndIf
EndIf
EndWith
DimsearchAsNewAmazonServices.ItemSearch
Withsearch
.SubscriptionId=SubscriptionId
.Request=NewAmazonServices.ItemSearchRequest()_
{searchRequest}
EndWith
GetResponse
DimresponseAsAmazonServices.ItemSearchResponse
Try
service.Timeout=5000
response=service.ItemSearch(search)
Catch
EndTry
IfIsNothing(response)Then
ReturnNothing
EndIf
Returnresponse.Items(0).Item
EndFunction
TheAmazonAuthorpropertyrepresentsalistofauthors.
Therefore,wecreateacommaseparatedlist
PublicSharedFunctionFormatAuthor(ByValAuthorsAsString())_
AsString
IfNotIsNothing(Authors)Then
ReturnString.Join(",",Authors)
Else
Return"NotListed"
EndIf
EndFunction
FormatsAmazonListPriceintoUScurrency
PublicSharedFunctionFormatPrice(ByValPriceAsString)AsString
IfNotIsNothing(Price)Then
Return"$"&Price.Insert(Price.Length-2,".")
Else
Return"NotListed"
EndIf
EndFunction
Formatstooltipforthelinktothebookdetails
PublicSharedFunction_
FormatDetailsTooltip(ByValTitleAsString)AsString
IfNotIsNothing(Title)Then
ReturnString.Format("Linkto{0}details",Title)
Else
Return"Linktodetails"
EndIf
EndFunction
Ifthereisnobookcover,wefallbacktodisplayingourimage
PublicSharedFunctionFormatBookCover(ByValUrlAsString)_
AsString
IfNotIsNothing(Url)Then
ReturnUrl
Else
Return"Images/NoBookCover.gif"
EndIf
EndFunction
EndClass
该类中的两个最主要的函数名为GetBooksFromAmazon和SearchBooksFromAmazon.第一个函数从Default.aspx页中挪用,以便依照种别显现书本清单。第二个函数从Search.aspx页中挪用,以便利用户可以搜刮书本。
这两个函数都利用名为AmazonServices的Web服务代办署理类。该代办署理类是经由过程顺次选择菜单选项Website、AddWebReference而且输出URLhttp://soap.amazon.com/onca/soap?Service=AWSECommerceService创立的。这是用于会见美国Amazon数据的准确的URL.
默许页
Default.aspx页显现书本种别的列表,而且显现所选种别的婚配书本的列表(拜见4)。Default.aspx页包括在清单11中。
4.默许页
<Palign=left> 清单11.Default.aspx
<%@PageLanguage="VB"MasterPageFile="~/SiteMaster.master"
Title="SuperSuperBooks"%>
<scriptrunat="server">
SubPage_Load()
DimcategoryIndexAsInteger=0
IfNotIsNothing(Request("index"))Then
categoryIndex=Int32.Parse(Request("index"))
EndIf
MenuCategories.Items(categoryIndex).Selected=True
EndSub
</script>
<asp:ContentID="Content1"ContentPlaceHolderID="ContentBody"
Runat="Server">
<h1>BookListings</h1>
<hr/>
<divid="leftColumn">
<asp:Menu
id="MenuCategories"
ToolTip="Bookcategoriesmenu"
StaticMenuItemStyle-CssClass="menuNormal"
StaticSelectedStyle-CssClass="menuSelected"
Runat="server">
<Items>
<asp:MenuItem
Text="ArtsandPhotography"
Value="1"
NavigateUrl="~/Default.aspx?index=0"/>
<asp:MenuItem
Text="BiographiesandMemoirs"
Value="2"
NavigateUrl="~/Default.aspx?index=1"/>
<asp:MenuItem
Text="ChildrensBooks"
Value="4"
NavigateUrl="~/Default.aspx?index=2"/>
<asp:MenuItem
Text="ComputersandInternet"
Value="5"
NavigateUrl="~/Default.aspx?index=3"/>
<asp:MenuItem
Text="Cooking,FoodandWine"
Value="6"
NavigateUrl="~/Default.aspx?index=4"/>
<asp:MenuItem
Text="ScienceFictionandFantasy"
Value="25"
NavigateUrl="~/Default.aspx?index=5"/>
</Items>
</asp:Menu>
</div>
<divid="middleColumn">
<asp:GridView
id="grdBooks"
DataSourceID="srcBooks"
AutoGenerateColumns="false"
CssClass="books"
HeaderStyle-CssClass="booksHeader"
EmptyDataText="Nomatchingresults"
Runat="server">
<Columns>
<asp:TemplateFieldHeaderText="BookCoverImage">
<ItemTemplate>
<asp:Image
id="imgBook"
ImageUrl=<%#Amazon.FormatBookCover(Eval("SmallImage.Url"))%>
AlternateText="Bookcoverimage"
Runat="server"/>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateFieldHeaderText="BookInformation">
<ItemTemplate>
<h4><%#Server.HtmlEncode(Eval("ItemAttributes.Title"))%></h4>
Authors:
<%#Amazon.FormatAuthor(Eval("ItemAttributes.Author"))%>
<br/>Price:
<%#Amazon.F我之所以想学。NET,是因为一直觉的BILLGATES好厉害,希望有一天能去微软,虽然现在还距离遥远,呵呵:) Servlet的形式和前面讲的CGI差不多,它是HTML代码和后台程序分开的。它们的启动原理也差不多,都是服务器接到客户端的请求后,进行应答。不同的是,CGI对每个客户请求都打开一个进程(Process)。 业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。 ASP.net1.1和2.0在程序上的语法也有很大不同,现在2.0属于新出来的,不知道半年后会不会有3.0(说笑一下)。Windows2003系统自动支持ASP和ASP.net环境,不用安装任何程序。Asp.net属于编译语言。ASP的最大不同(ASP属于解释语言)。 平台无关性是PHP的最大优点,但是在优点的背后,还是有一些小小的缺点的。如果在PHP中不使用ODBC,而用其自带的数据库函数(这样的效率要比使用ODBC高)来连接数据库的话,使用不同的数据库,PHP的函数名不能统一。这样,使得程序的移植变得有些麻烦。不过,作为目前应用最为广泛的一种后台语言,PHP的优点还是异常明显的。 平台无关性是PHP的最大优点,但是在优点的背后,还是有一些小小的缺点的。如果在PHP中不使用ODBC,而用其自带的数据库函数(这样的效率要比使用ODBC高)来连接数据库的话,使用不同的数据库,PHP的函数名不能统一。这样,使得程序的移植变得有些麻烦。不过,作为目前应用最为广泛的一种后台语言,PHP的优点还是异常明显的。 业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。 关于ASP.NET功能上,ASP.NET比微软以前的ASP(96年出现)有更强大的library,更好的稳定性。ASP.NET可以使用.NETFramework中所有组件(也就是说.NET能实现的,ASP.NET一样能实现)。 ASP.net1.1和2.0在程序上的语法也有很大不同,现在2.0属于新出来的,不知道半年后会不会有3.0(说笑一下)。Windows2003系统自动支持ASP和ASP.net环境,不用安装任何程序。Asp.net属于编译语言。ASP的最大不同(ASP属于解释语言)。
页:
[1]