WebPart全接触1(如何管理自己的WebPart个性化数据)

本文介绍如何在ASP.NET中自定义WebPart个性化数据的存储方式,避免依赖ASP.NET自带数据库,实现个性化数据的自主管理。

是不是觉得WebPart存储在asp.net自带的数据库中觉得很不保险?每次做一个带WebPart的项目都必须让asp.net部署一个aspnetdb数据库,好像WebPart的数据并不能完全融入自己的系统体系中。

本文将介绍如何从Asp.net中获取WebPart个性化数据,如何存储这些数据。

1 在Asp.Net2.0中,是如何存取WebPart数据的?

在Asp.Net2.0中,默认是通过SqlPersonalizationProvider类存取数据的,提到SqlPersonalizationProvider,就不得不提他的父类PersonalizationProvider,PersonalizationProvider提供了个性化数据的一些抽象方法,来存储和读取WebPart的个性化数据,我们当然也可以建造一个 MyPersonalizationProvider来存取我们自己的个性化数据.

在此着重介绍

  • SavePersonalizationBlob()

//
        // 摘要:
        //     将原始个性化设置数据保存到基础 Microsoft SQL Server 数据库中。
        //
        // 参数:
        //   webPartManager:
        //     管理个性化设置数据的 System.Web.UI.WebControls.WebParts.WebPartManager。
        //
        //   userName:
        //     System.Web.UI.WebControls.WebParts.PersonalizationScope.User 范围中要用作关键字的个性化设置信息的用户名。
        //
        //   dataBlob:
        //     要保存的数据的字节数组。
        //
        //   path:
        //     指示要保存的个性化设置信息的 System.Web.UI.WebControls.WebParts.PersonalizationScope。此值不能为null。

protected  SavePersonalizationBlob( webPartManager,  path,  userName, [] dataBlob);
参数webPartManager就是你的页面上的放的webPartManager
参数path指的是你的WebPart部署在哪个页面上,在Index.aspx上还是Default.aspx上
参数userName,如果你使用了MemberShip,则返回你的UserName.
参数dataBlob,就是WebPart个性化数据,你可以存储在任意的Image字段中
如果您有一个这样的数据结构:
IdPageUserIddataBlob
0Index.aspxA01********
1default.aspxA02********

 

您就可以将WebPart数据掌握在自己手中了。

我们可以参考一下SqlPersonalizationProvider中是如何存储的

ContractedBlock.gifExpandedBlockStart.gifSavePersonalizationBlob
None.gifprivate void SavePersonalizationState(SqlConnection connection, string path, string userName, byte[] state)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    SqlCommand command;
InBlock.gif    
if (userName != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        command 
= new SqlCommand("dbo.aspnet_PersonalizationPerUser_SetPageSettings", connection);
ExpandedSubBlockEnd.gif    }

InBlock.gif    
else
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        command 
= new SqlCommand("dbo.aspnet_PersonalizationAllUsers_SetPageSettings", connection);
ExpandedSubBlockEnd.gif    }

InBlock.gif    
this.SetCommandTypeAndTimeout(command);
InBlock.gif    command.Parameters.Add(
this.CreateParameter("@ApplicationName", SqlDbType.NVarChar, this.ApplicationName));
InBlock.gif    command.Parameters.Add(
this.CreateParameter("@Path", SqlDbType.NVarChar, path));
InBlock.gif    command.Parameters.Add(
this.CreateParameter("@PageSettings", SqlDbType.Image, state));
InBlock.gif    command.Parameters.Add(
this.CreateParameter("@CurrentTimeUtc", SqlDbType.DateTime, DateTime.UtcNow));
InBlock.gif    
if (userName != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        command.Parameters.Add(
this.CreateParameter("@UserName", SqlDbType.NVarChar, userName));
ExpandedSubBlockEnd.gif    }

InBlock.gif    command.ExecuteNonQuery();
ExpandedBlockEnd.gif}

None.gif
None.gif

 

  • LoadPersonalizationBlobs()

//
       // 摘要:
       //     根据指定参数从基础数据存储区加载个性化设置数据。
       //
       // 参数:
       //   sharedDataBlob:
       //     为 System.Web.UI.WebControls.WebParts.PersonalizationScope.Shared 范围返回的数据。
       //
       //   webPartManager:
       //     管理个性化设置数据的 System.Web.UI.WebControls.WebParts.WebPartManager。
       //
       //   userName:
       //     System.Web.UI.WebControls.WebParts.PersonalizationScope.User 范围中要用作检索关键字的个性化设置信息的用户名。
       //
       //   userDataBlob:
       //     为 System.Web.UI.WebControls.WebParts.PersonalizationScope.User 范围返回的数据。
       //
       //   path:
       //     System.Web.UI.WebControls.WebParts.PersonalizationScope.Shared 范围中要用作检索关键字的个性化设置信息的路径。

protected  LoadPersonalizationBlobs( webPartManager,  path,  userName, ref [] sharedDataBlob, ref [] userDataBlob);
前几个参数就不一一介绍了,它们和SavePersonalizationBlob()中使用的参数并无二致。只是个性化参数分了sharedDataBlob和userDataBlob。
如果某个WebPartManager中设置Personalization-InitialScope指定为User的,则属性的值存储在userDataBlob中;如果指定为Shared,则存储在sharedDataBlob。
或者是设置某个个性化属性

[ResourceWebDisplayName(""), Personalizable(PersonalizationScope.Shared)]
        public long MyProperty
        {
            get {
                return _myProperty; }
            set { _myProperty= value; }
        }

我们也参考一下SqlPersonalizationProvider是如何读取的。
ContractedBlock.gifExpandedBlockStart.gifLoadPersonalizationBlobs
None.gifprotected override void LoadPersonalizationBlobs(WebPartManager webPartManager, string path, string userName, ref byte[] sharedDataBlob, ref byte[] userDataBlob)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    sharedDataBlob 
= null;
InBlock.gif    userDataBlob 
= null;
InBlock.gif    SqlConnectionHolder connectionHolder 
= null;
InBlock.gif    SqlConnection connection 
= null;
InBlock.gif    
try
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
try
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            connectionHolder 
= this.GetConnectionHolder();
InBlock.gif            connection 
= connectionHolder.Connection;
InBlock.gif            
this.CheckSchemaVersion(connection);
InBlock.gif            sharedDataBlob 
= this.LoadPersonalizationBlob(connection, path, null);
InBlock.gif            
if (!string.IsNullOrEmpty(userName))
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                userDataBlob 
= this.LoadPersonalizationBlob(connection, path, userName);
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif        
finally
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
if (connectionHolder != null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                connectionHolder.Close();
InBlock.gif                connectionHolder 
= null;
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif    
catch
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
throw;
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gif





2 我们写好了MyPersonalizationProvider,怎么将它应用到我们的系统中呢?
很简单,只要在Web.config中的<System.web>节中指定

<webParts>
            <personalization defaultProvider="MyPersonalizationProvider">
                <providers>
                    <clear/>
                    <add name="MyPersonalizationProvider" type="MyCompany.MyPersonalizationProvider" connectionStringName="Default"/>
                </providers>
            </personalization>
        </webParts>

 至此,您就可以完全抛弃aspnetdb数据库了,再建立任何的webpart应用都不需要跑一次aspnet_regsql.exe来初始化
aspnetdb数据库

转载于:https://www.cnblogs.com/Aldebaran/archive/2008/07/18/1246232.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值