استفاده از webpart آزادی زیادی برای چیدن صفحه ها به کاربران می دهد . برای هر صفحه می توان آیتم های متفاوتی استفاده کرد به طوری که هیچ کدام از صفحه های یک سایت شبیه یکدیگر نباشد . حتی هر کاربر هم می تواند متناسب با نیاز خود صفحه ها را تغییر دهد . نمونه خوب این مدل سایت ها iGoogle ، PageFlakes و Dropthings.com هستند . سازنده Dropthings یک کتاب هم دارد که روش ایجاد آنچنان سایتی را در آن توضیح داده است .
در سایتهایی که فقط مدیر آنها می خواهد صفحه ها را بچیند نیازی به این همه آزادی عمل نیست . کاربران لزومی ندارد بتوانند همه اجزای صفحه ها را برابر سلیقه خود تغییر دهند . حتی بعضی سایتها مثل همین جا ، اصلا ً نیازی نیست هر صفحه برای خود webpart های جداگانه ای داشته باشد ، فقط کپی از یک صفحه برای تمامی صفحه ها کافی است .
راهی که من برای کپی webpart ها برای همه صفحه ها استفاده کردم نشان دادن webpart های یک صفحه در همه جا با استفاده از تغییر در Provider مربوطه بود . یک صفحه را نیز برای ویرایش و افزودن webpart ها ایجاد کردم که بعد از login کردن فعال می شود .
کد کلاسی که کار Provider جدید را انجام می دهد را در زیر می بینید :
Public
Class CustomWebpartPersonalization
Inherits SqlPersonalizationProvider
Private PersianPath As String = "~/fa/default.aspx"
Private EnglishPAth As String = "~/en/default.aspx"
Protected Overrides Sub LoadPersonalizationBlobs(ByVal webPartManager As System.Web.UI.WebControls.WebParts.WebPartManager, ByVal path As String, ByVal userName As String, ByRef sharedDataBlob() As Byte, ByRef userDataBlob() As Byte)
If InStr(path.ToLower, "/fa/") > 0 Then
MyBase.LoadPersonalizationBlobs(webPartManager, PersianPath, userName, sharedDataBlob, userDataBlob)
Else
MyBase.LoadPersonalizationBlobs(webPartManager, EnglishPAth, userName, sharedDataBlob, userDataBlob)
End If
End Sub
Protected Overrides Sub SavePersonalizationBlob(ByVal webPartManager As System.Web.UI.WebControls.WebParts.WebPartManager, ByVal path As String, ByVal userName As String, ByVal dataBlob() As Byte)
If InStr(path.ToLower, "/fa/") > 0 Then
MyBase.SavePersonalizationBlob(webPartManager, PersianPath, userName, dataBlob)
Else
MyBase.SavePersonalizationBlob(webPartManager, EnglishPAth, userName, dataBlob)
End If
End Sub
Protected Overrides Sub ResetPersonalizationBlob(ByVal webPartManager As System.Web.UI.WebControls.WebParts.WebPartManager, ByVal path As String, ByVal userName As String)
If InStr(path.ToLower, "/fa/") > 0 Then
MyBase.ResetPersonalizationBlob(webPartManager, PersianPath, userName)
Else
MyBase.ResetPersonalizationBlob(webPartManager, EnglishPAth, userName)
End If
End Sub
End
Class
در web.config هم این تغییر لازم است :
<
webParts>
<
personalization defaultProvider="AspNetSqlPersonalizationProvider2">
<
providers>
<
add connectionStringName="MyConnectionString" name="AspNetSqlPersonalizationProvider2" type="ProjectName.CustomWebpartPersonalization"/>
</
providers>
</
webParts>