您的位置:首页 > 编程语言 > ASP

[ASP.NET 控件实作 Day5] 属性与 ViewState

2008-10-14 07:00 411 查看
在ASP.NET中,控件的属性与ViewState有着密不可分的关系,透过ViewState才有辨法维护控件的属性值。在本文中将介绍属性与ViewState的关系,并说明属性如何存取ViewState是比较有效率的方式。

一、属性与VIewState
当你加入一个「ASP.NET服务器控件」时,类别中预设会有一个Text属性写法的范例如下所示,属性的读写都是直接存取ViewState,这是一般常见的控件属性写法。可是这种属性的写法是没有效率的,因为ViewState的成员是Object型别,每次读取属性时都是由ViewState取出指定键值的成员再转型为属性的型别,写入属性的动作也是直接写入ViewState中。

PropertyText()AsString

[code]Get
DimsAsString=CStr(ViewState("Text"))

IfsIsNothingThen

ReturnString.Empty

Else

Returns

EndIf

EndGet


Set(ByValValueAsString)

ViewState("Text")=Value

EndSet

EndProperty

[/code]
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

比较好的方式应该是读取ViewState成员只做一次型别转换的动作,而写入ViewState的动作可以在Render前做批次写入的动作即可。为了达到这样的需求,我们可以覆写LoadViewState及SaveViewState方法来处理属性与ViewState的存取动作;当控件初始化后会执行LoadViewState方法,来加载ViewState还原的控件状态,当控件Render之前,会执行SaveViewState方法,将控件的最终状态存入ViewState中,也就是在此方法之后对控件所做的任何变更都将会被忽略。
我们改写属性的写法,不直接用ViewState来存取属性,而是改用「属性区域变量」来存取属性,在LoadViewState时加载ViewState到属性区域变量,而SaveViewState时再将属性区域变量写入ViewState中。我们依此方式将Text属性改写如下。

PrivateFTextAsString

[code]
PropertyText()AsString

Get

ReturnFText

EndGet

Set(ByValValueAsString)

FText=Value

EndSet

EndProperty


'''<summary>

'''載入ViewState還原控制項狀態。

'''</summary>

ProtectedOverridesSubLoadViewState(ByValsavedStateAsObject)

IfNot(savedStateIsNothing)Then

'LoadStatefromthearrayofobjectsthatwassavedatvedViewState.

DimmyStateAsObject()=CType(savedState,Object())


IfNot(myState(0)IsNothing)Then

MyBase.LoadViewState(myState(0))

EndIf


IfNot(myState(1)IsNothing)Then

FText=CType(myState(1),String)

EndIf

EndIf

EndSub


'''<summary>

'''將控制項狀態寫入ViewState中。

'''</summary>

ProtectedOverridesFunctionSaveViewState()AsObject

DimbaseStateAsObject=MyBase.SaveViewState()

DimmyState(1)AsObject

myState(0)=baseState

myState(1)=FText

ReturnmyState

EndFunction

[/code]
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

利用上述的方式,我们可以在LoadViewState批次加载所有属性值,而在SaveViewState批次写入属性值,如此在读取属性就不用一直做型别转换的动作以改善效率。

二、结语
虽然属性一般都是储存于ViewState中,不过若是一些无关紧要的属性或是完全不会执行阶段就变更的属性,可以考虑不需要将这些属性储存于ViewState中;因为ViewState是个两面刃,ViewState可以很轻易帮我们维护属性值,不过相对的也增加了面页的传输量,所以可以视实际情形来决定属性是否要储存于ViewState中。

备注:本文同步发布于「第一届iT邦帮忙铁人赛」,如果你觉得这篇文章对您有帮助,记得连上去推鉴此文增加人气^^

http://ithelp.ithome.com.tw/question/10011745
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: