Protected
Overrides
ReadOnly
Property
PageStatePersister()
As
System.Web.UI.PageStatePersister
Get
' Set ViewState Persister to default (as defined in Base Class)
Dim _persister As PageStatePersister = MyBase .PageStatePersister
If Not DotNetNuke.Common.Globals.HostSettings( " PageStatePersister " ) Is Nothing Then
Select Case DirectCast (DotNetNuke.Common.Globals.HostSettings( " PageStatePersister " ), String )
Case " M "
_persister = New CachePageStatePersister( Me )
Case " D "
_persister = New DiskPageStatePersister( Me )
Case " S "
_persister = New SessionPageStatePersister( Me )
End Select
End If
Return _persister
End Get
End Property
从上面的Code中我们看到,DNN只handle "M", "D", "S"这几种,如果把viewstate保存在Page中的话,就会用.Net 默认的PageStaePersister.
Get
' Set ViewState Persister to default (as defined in Base Class)
Dim _persister As PageStatePersister = MyBase .PageStatePersister
If Not DotNetNuke.Common.Globals.HostSettings( " PageStatePersister " ) Is Nothing Then
Select Case DirectCast (DotNetNuke.Common.Globals.HostSettings( " PageStatePersister " ), String )
Case " M "
_persister = New CachePageStatePersister( Me )
Case " D "
_persister = New DiskPageStatePersister( Me )
Case " S "
_persister = New SessionPageStatePersister( Me )
End Select
End If
Return _persister
End Get
End Property
接下来,我们打开Reflector看看System.Web.UI.Page是怎么写的:
protected
virtual
PageStatePersister PageStatePersister
{
get
{
if ( this ._persister == null )
{
PageAdapter pageAdapter = this .PageAdapter;
if (pageAdapter != null )
{
this ._persister = pageAdapter.GetStatePersister();
}
if ( this ._persister == null )
{
this ._persister = new HiddenFieldPageStatePersister( this );
}
}
return this ._persister;
}
}
好了,我们可以看到,原来会先从PageAdapter中拿,如果找不到的话,才会用:
HiddenFieldPageStatePersister.
{
get
{
if ( this ._persister == null )
{
PageAdapter pageAdapter = this .PageAdapter;
if (pageAdapter != null )
{
this ._persister = pageAdapter.GetStatePersister();
}
if ( this ._persister == null )
{
this ._persister = new HiddenFieldPageStatePersister( this );
}
}
return this ._persister;
}
}
这样我们就可以从PageAdapter下手了。
首先PageApater:
public
class
HCPageAdapter : PageAdapter
{
public override PageStatePersister GetStatePersister()
{
return new XmlPageStatePersister( base .Page);
}
}
其中:
XmlPageStatePersister的任务就是save, Load Viewstate From server disk.
{
public override PageStatePersister GetStatePersister()
{
return new XmlPageStatePersister( base .Page);
}
}
然后的.Browser文件,告诉.Net要加载 HCPageAdapter
<
browsers
>
< browser refID ="Default" >
< controlAdapters >
< adapter controlType ="DotNetNuke.Framework.PageBase"
adapterType ="HC.DNN.Services.ViewState.HCPageAdapter" />
</ controlAdapters >
</ browser >
</ browsers >
Ok, 现在编译,把dll放到bin folder, .Browser文件放到App_browser folder就完成了, 这样即使下载升级DNN也不影响。
< browser refID ="Default" >
< controlAdapters >
< adapter controlType ="DotNetNuke.Framework.PageBase"
adapterType ="HC.DNN.Services.ViewState.HCPageAdapter" />
</ controlAdapters >
</ browser >
</ browsers >
你可以从这里下载本文用到的Code: DNN store Viewstate in disk revised