ASP.NET网页设计ASP.NET ViewState 初探
因为二次编译器太复杂,那么建议只是在安装程序的时候编译一次,而不类似java那样运行就编译。并且我觉得,一次痛苦,总比多次低效率要舒服多了。asp.net与刚打仗ASP.NET页面的开辟职员扳谈时,他们一般向我提出的第一个成绩就是:“谁人ViewState究竟是甚么?”他们的语气中吐露出的那种感到,就象我离开一家异国情调的餐馆,酒保端上一道我从未见过的菜肴时的那种感到-既迷惑不解,又充斥猎奇。但一定有人以为它不错,不然就不会供应了。以是,我会先尝一尝,也许会喜好上它,只管它看上往切实其实很乖僻!关于ViewState也是云云,可是假如顺应了它的作风,您会发明在很多情形下,您将乐于在本人的ASP.NET使用程序中利用ViewState,由于它能够匡助您利用更少的代码完成更多的事情。可是,偶然也会对ViewState完整弃之不必。上面我们就这两种情形分离举行论述,不外,让我们先回覆甚么是ViewState这个成绩。
谜底:ViewState用于保护页面的UI形态
Web是没有形态的,ASP.NET页面也没有形态,它们在到服务器的每一个往复过程当中被实例化、实行、出现和处置。作为Web开辟职员,您可使用尽人皆知的手艺(如以会话形态将形态存储在服务器上,或将页面回传到本身)来增加形态。上面我们以中的注册窗体为例举行叙述。
:恢复回传的窗体值
从上图中能够看出,我为便餐选择了一个有效的值。此窗体与Web上的多半窗体一样友爱,它在呈现毛病的字段中间显现一条有效的毛病动静和一个星号。并且,窗体中还显现了我在其他文本框和下拉列表中输出的一切无效值。这在某种水平上是大概的,由于HTML窗体元素会在HTTP标头中将其以后值从扫瞄器发送到服务器。您可使用ASP.NET跟踪来检察回传的窗体值,如所示。
:HTTP窗体中回传的值(经由过程ASP.NET跟踪显现)
在ASP.NET之前,经由过程屡次回传将值恢复到窗体字段中完整是页面开辟职员的义务,他们将不能不从HTTP窗体中逐一拾取回传值,然后再将其推回字段中。侥幸的是,如今ASP.NET能够主动完成这项义务,从而为开辟职员免去了一项使人腻烦的事情,同时也无需再为窗体编写大批的代码。但这并非ViewState。
ViewState(英文)是一种机制,ASP.NET利用这类机制来跟踪服务器控件形态值,不然这些值将不作为HTTP窗体的一部分而回传。比方,由Label控件显现的文本默许情形下就保留在ViewState中。作为开辟职员,您能够绑定命据,或在初次加载该页面时仅对Label编程设置一次,在后续的回传中,该标签文本将主动从ViewState中从头添补。因而,除能够削减烦琐的事情和代码外,ViewState一般还能够削减数据库的往复次数。
ViewState的事情道理
ViewState的确没有甚么奥秘的地方,它是由ASP.NET页面框架办理的一个埋没的窗体字段。当ASP.NET实行某个页面时,该页面上的ViewState值和一切控件将被搜集并格局化成一个编码字符串,然后被分派给埋没窗体字段的值属性(即<inputtype=hidden>)。因为埋没窗体字段是发送到客户真个页面的一部分,以是ViewState值被一时存储在客户真个扫瞄器中。假如客户端选择将该页面回传给服务器,则ViewState字符串也将被回传。在下面的中能够看到ViewState窗体字段及其回传的值。
回传后,ASP.NET页面框架将剖析ViewState字符串,并为该页面和各个控件添补ViewState属性。然后,控件再利用ViewState数据将本人从头恢复为之前的形态。
关于ViewState另有三个值得注重的小成绩。
假如要利用ViewState,则在ASPX页面中必需有一个服务器端窗体标志(<formrunat=server>)。窗体字段是必须的,如许包括ViewState信息的埋没字段才干回传给服务器。并且,该窗体还必需是服务器真个窗体,如许在服务器上实行该页面时,ASP.NET页面框架才干增加埋没的字段。
页面自己将20字节摆布的信息保留在ViewState中,用于在回传时将PostBack数据和ViewState值分发给准确的控件。因而,即便该页面或使用程序禁用了ViewState,仍能够在ViewState中看到大批的残剩字节。
在页面不回传的情形下,能够经由过程省略服务器真个<form>标志往复除页面中的ViewState。
充实使用ViewState
ViewState为跨回传跟踪控件的形态供应了一条奇妙的路子,由于它不利用服务器资本、不会超时,而且合用于任何扫瞄器。假如您要编写控件,那末一定必要懂得怎样在控件中保护形态(英文)。
开辟职员在编写页面时一样能够依照几近不异的体例来使用ViewState,只是偶然页面会包括不由控件存储的UI形态值。您能够跟踪ViewState中的值,利用的编程语法预会话和高速缓存的语法相似:
保留在ViewState中
ViewState("SortOrder")="DESC"
从ViewState中读取
DimSortOrderAsString=CStr(ViewState("SortOrder"))
//保留在ViewState中
ViewState["SortOrder"]="DESC";
//从ViewState中读取
stringsortOrder=(string)ViewState["SortOrder"];
请看上面的示例:要在Web页上显现一个项目列表,而每一个用户必要分歧的列表排序。项目列表是静态的,因而能够将这些页面绑定到不异的缓存数据集,而排序按次只是用户特定的UI形态的一小部分。ViewState十分合适于存储这类范例的值。代码以下:
<%@ImportNamespace="System.Data"%>
<HTML>
<HEAD>
<title>用于页面UI形态值的ViewState/title>
</HEAD>
<body>
<formrunat="server">
<H3>
在ViewState中存储非控件形态
</H3>
<P>
此示例将一列静态数据确当前排序按次存储在ViewState中。<br>
单击列题目中的链接,可按该字段排序数据。<br>
再次单击该链接,将按相反按次排序。
<br><br><br>
<asp:datagridid="DataGrid1"runat="server"
OnSortCommand="SortGrid"BorderStyle="None"BorderWidth="1px"
BorderColor="#CCCCCC"BackColor="White"CellPadding="5"AllowSorting="True">
<HeaderStyleFont-Bold="True"ForeColor="White"
BackColor="#006699">
</HeaderStyle>
</asp:datagrid>
</P>
</form>
</body>
</HTML>
<scriptrunat="server">
在ViewState中跟踪SortField属性
PropertySortField()AsString
Get
DimoAsObject=ViewState("SortField")
IfoIsNothingThen
ReturnString.Empty
EndIf
ReturnCStr(o)
EndGet
Set(ValueAsString)
IfValue=SortFieldThen
与以后排叙文件不异,切换排序偏向
SortAscending=NotSortAscending
EndIf
ViewState("SortField")=Value
EndSet
EndProperty
在ViewState中跟踪SortAscending属性
PropertySortAscending()AsBoolean
Get
DimoAsObject=ViewState("SortAscending")
IfoIsNothingThen
ReturnTrue
EndIf
ReturnCBool(o)
EndGet
Set(ValueAsBoolean)
ViewState("SortAscending")=Value
EndSet
EndProperty
PrivateSubPage_Load(senderAsObject,eAsEventArgs)HandlesMyBase.Load
IfNotPage.IsPostBackThen
BindGrid()
EndIf
EndSub
SubBindGrid()
猎取数据
DimdsAsNewDataSet()
ds.ReadXml(Server.MapPath("TestData.xml"))
DimdvAsNewDataView(ds.Tables(0))
使用排序过滤器和偏向
dv.Sort=SortField
IfNotSortAscendingThen
dv.Sort+="DESC"
EndIf
绑定网格
DataGrid1.DataSource=dv
DataGrid1.DataBind()
EndSub
PrivateSubSortGrid(senderAsObject,eAsDataGridSortCommandEventArgs)
DataGrid1.CurrentPageIndex=0
SortField=e.SortExpression
BindGrid()
EndSub
</script>
<%@PageLanguage="C#"%>
<%@ImportNamespace="System.Data"%>
<HTML>
<HEAD>
<title>用于页面UI形态值的ViewState</title>
</HEAD>
<body>
<formrunat="server">
<H3>
在ViewState中存储非控件形态
</H3>
<P>
此示例将一列静态数据确当前排序按次存储在ViewState中。<br>
单击列题目中的链接,可按该字段排序数据。<br>
再次单击该链接,将按相反按次排序。
<br><br><br>
<asp:datagridid="DataGrid1"runat="server"OnSortCommand="SortGrid"
BorderStyle="None"BorderWidth="1px"BorderColor="#CCCCCC"
BackColor="White"CellPadding="5"AllowSorting="True">
<HeaderStyleFont-Bold="True"ForeColor="White"BackColor="#006699">
</HeaderStyle>
</asp:datagrid>
</P>
</form>
</body>
</HTML>
<scriptrunat="server">
//在ViewState中跟踪SortField属性
stringSortField{
get{
objecto=ViewState["SortField"];
if(o==null){
returnString.Empty;
}
return(string)o;
}
set{
if(value==SortField){
//与以后排叙文件不异,切换排序偏向
SortAscending=!SortAscending;
}
ViewState["SortField"]=value;
}
}
//在ViewState中跟踪SortAscending属性
boolSortAscending{
get{
objecto=ViewState["SortAscending"];
if(o==null){
returntrue;
}
return(bool)o;
}
set{
ViewState["SortAscending"]=value;
}
}
voidPage_Load(objectsender,EventArgse){
if(!Page.IsPostBack){
BindGrid();
}
}
voidBindGrid(){
//猎取数据
DataSetds=newDataSet();
ds.ReadXml(Server.MapPath("TestData.xml"));
DataViewdv=newDataView(ds.Tables);
//使用排序过滤器和偏向
dv.Sort=SortField;
if(!SortAscending){
dv.Sort+="DESC";
}
//绑定网格
DataGrid1.DataSource=dv;
DataGrid1.DataBind();
}
voidSortGrid(objectsender,DataGridSortCommandEventArgse){
DataGrid1.CurrentPageIndex=0;
SortField=e.SortExpression;
BindGrid();
}
</script>
上面是上述两个代码段中援用的testdata.xml的代码:
<?xmlversion="1.0"standalone="yes"?>
<NewDataSet>
<Table>
<pub_id>0736</pub_id>
<pub_name>NewMoonBooks</pub_name>
<city>Boston</city>
<state>MA</state>
<country>USA</country>
</Table>
<Table>
<pub_id>0877</pub_id>
<pub_name>Binnet&Hardley</pub_name>
<city>Washington</city>
<state>DC</state>
<country>USA</country>
</Table>
<Table>
<pub_id>1389</pub_id>
<pub_name>AlgodataInfosystems</pub_name>
<city>Berkeley</city>
<state>CA</state>
<country>USA</country>
</Table>
<Table>
<pub_id>1622</pub_id>
<pub_name>FiveLakesPublishing</pub_name>
<city>Chicago</city>
<state>IL</state>
<country>USA</country>
</Table>
<Table>
<pub_id>1756</pub_id>
<pub_name>RamonaPublishers</pub_name>
<city>Dallas</city>
<state>TX</state>
<country>USA</country>
</Table>
<Table>
<pub_id>9901</pub_id>
<pub_name>GGG&G</pub_name>
<city>Muenchen</city>
<country>Germany</country>
</Table>
<Table>
<pub_id>9952</pub_id>
<pub_name>ScootneyBooks</pub_name>
<city>NewYork</city>
<state>NY</state>
<country>USA</country>
</Table>
<Table>
<pub_id>9999</pub_id>
<pub_name>LucernePublishing</pub_name>
<city>Paris</city>
<country>France</country>
</Table>
</NewDataSet>
我也不知道,我原来理解的,NET就是C++编程,只是与JAVA相对,呵呵。以为.ET就是高级C++编程。 主流网站开发语言之JSP:JSP和Servlet要放在一起讲,是因为它们都是Sun公司的J2EE(Java2platformEnterpriseEdition)应用体系中的一部分。 HTML:当然这是网页最基本的语言,每一个服务器语言都需要它的支持,要学习,这个肯定是开始,不说了. CGI程序在运行的时候,首先是客户向服务器上的CGI程序发送一个请求,服务器接收到客户的请求后,就会打开一个新的Process(进程)来执行CGI程序,处理客户的请求。CGI程序最后将执行的结果(HTML页面代码)传回给客户。 ASP.net的服务器,要求安装一个.net环境,当然我这里指的是windows系统,顺便点一下,.net只能放在windows环境里来运行。Asp.net1.1的就装Framework1.1,Asp.net2.0的就装Framework2.0。 是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错)。 在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数。 ASP(ActiveServerPages)是Microsfot公司1996年11月推出的WEB应用程序开发技术,它既不是一种程序语言,也不是一种开发工具,而是一种技术框架,不须使用微软的产品就能编写它的代码。 主流网站开发语言之CGI:CGI就是公共网关接口(CommonGatewayInterface)的缩写。它是最早被用来建立动态网站的后台技术。这种技术可以使用各种语言来编写后台程序,例如C,C++,Java,Pascal等。
页:
[1]