محتویات سایت
        برچسب های محبوب 








 
   وب پارت - قسمت دوم
  بررسی بيشتر وب پارتها با استفاده از مثال
   ASP.NET
   ۳۲۷۹۲
   دریافت فایل ضمیمه
   رکسانا زاهدی
   ۱۳۸۶/۶/۲۴
نسخه قابل چاپ نسخه قابل چاپ


همانگونه که در مقاله قبل نيز اشاره شد، صفحه اي که براي ميزباني يک وب پارت طراحي مي شود اصطلاحا "صفحه وب پارت" يا WebPart page ناميده مي شود. يک صفحه وب پارت تنها به يک  کنترل "WebPartManger" و تعدادي کنترل "WebPartZone" نياز دارد. لازم به ذکر است که براي اضافه کردن اين کنترلها به صفحه کافي است در منوي Toolbox به قسمت WebParts رفته و کنترلهاي مورد نظر خود را به صفحه اضافه نماييم.


يک وب پارت ممکن است به صورت دلخواه شما شامل يک کنترل EditorZone  و يا CatalogZone باشد. توجه داشته باشيد که تگ WebPartManager بايد در يک فايل .aspx(يا صفحه معمولي وبي در محيط دات نت) و قبل از هر تگ وابسته ديگري از قبيل WebPartZone يا EditorZone  قرار بگيرد. براي داشتن ظاهري بهتر از از يک صفحه وب پارت بهتر است، بوسيله جداول و تگهاي HTML محل زونها را در صفحه کنترل نماييم.


        <asp:WebPartManager ID="WebPartManager1" runat="server"/>
           <asp:WebPartZone ID="WebPartZone1" runat="server">
             <ZoneTemplate>
             <!--            
            وب پارتها در اين قسمت اضافه مي شوند            
            -->
             </ZoneTemplate>
            </asp:WebPartZone>
 

در اين قسمت به ايجاد يک کلاس ساده که از وب پارت مشتق شده است، مي پردازيم.


using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
namespace WingtipWebParts
{
    public class HelloWorld: WebPart
    {
        public HelloWorld()
     {
            this.Title = "Hello World!";
            this.TitleIconImageUrl = @"img\test.gif";
     }
        protected override void RenderContents(HtmlTextWriter writer)
        {
            writer.Write("Can I have your attention please?");
        }
    }
}

هر نمونه (instance) از يک وب پارت با يک ايندکس خاص در يک WebPartZone در يک صفحه مشخص مي شود. يک WebPartZone مي تواند چندين نمونه از وب پارت را در خود نگهداري نمايد. 
چنانچه مانند مثال گفته شده در بالا شما کلاسي داريد که از يک وب پارت به ارث رفته است ، مي توانيد نمونه اي از آن کلاس را ايجاد کرده و با استفاده از متد AddWebPart که متعلق به WebPartManager است، آن را به صفحه اضافه نماييد. البته بايد در نظر داشته باشيد که پارامترهاي لازم را نيز به آن ارسال نماييد که اين پارامترها عبارتند از: نمونه ايجاد شده از کلاس، زوني که وب پارت در آن قرار مي گيرد و ايندکسي که در آن قرار مي گيرد.


//  ايجاد نمونه وب پارت از يک کلاس مشتق شده وب پارت
WebPart wp1 = new WingtipWebParts.HelloWorld();
WebPartManager1.AddWebPart(wp1, WebPartZone1, 0);
 

روش فوق براي ايجاد کنترل در هنگام برنامه نويسي است. اما روش ديگري با نام Declarative وجود دارد که با استفاده از تگها مي توان کنترل مورد نظر خود را در محدوده صفحه ايجاد کرد به صورت زير:


<%@ Register Assembly="WingtipWebParts" Namespace="WingtipWebParts" TagPrefix="Wingtip" %>
<asp:WebPartManager ID=" WebPartManager1" runat="server" />
<asp:WebPartZone ID="WebPartZone1" runat="server" HeaderText="Zone 1">
  <ZoneTemplate>
    <Wingtip:HelloWorld runat="server" id="HelloWorld" />
  </ZoneTemplate>
</asp:WebPartZone>

در ايجاد صفحاتي که از وب پارتها استفاده مي کنند بايد به خاطر داشته باشيد که استفاده از روشهاي مختلف زيبا سازي صفحه ، که يکي از آنها استفاده از اسکينها و دادن style به صفحات مي باشد، در ارائه وب سايت به صورت حرفه اي نقش بسزايي را ايفا مي نمايد.

 

حالتهاي نمايش و ميدان عمل صفحه :

همانگونه که قبلا نيز گفته شد، يک WebPartManager مسئول مديريت نمونه هاي وب پارت و چگونگي ارتباط آنها با WebPartZone ها در صفحه مي باشد، همچنين امکان سوييچ کردن بين حالتهاي Browse، ويرايش و طراحي را به وجود مي آورد. به عنوان مثال شما مي توانيد در رويداد Click يک دکمه به هر يک از اين حالتها سوييچ کنيد.

 


WebPartManager1.DisplayMode = WebPartManager.DesignDisplayMode;

به صورت پيش فرض يک صفحه وب پارت در حالت Browse قرار دارد و به کاربر عادي اجازه ايجاد تغيير در وب پارت را نمي دهد و زماني که صفحه در حالت Design قرار بگيرد، کاربر مي تواند وب پارت را در يک زون و يا مابين زونهاي ديگر جابجا کند. علاوه بر اين وب پارت ايجاد تغيير در ميدان عمل کاربر و يا حالت عمومي را امکان پذير مي نمايد. به عبارت ديگر ميدان عمل مشخص مي کند که تغيرات يک وب پارت Personalization  است و يا Customization. Personalization يا شخصي سازي  تغييراتي است که تنها توسط خود کاربر و Customization براي تمامي کاربران قابل مشاهده است.
براي تغيير دادن ميدان عمل يک صفحه از متد ToggleScope استفاده مي شود:


WebPartManager1.Personalization.ToggleScope();

به صورت پيش فرض دامنه عمل براي شخص (Personalization)  و در صورتي که از متد بالا استفاده شود به حالت عمومي يا (customization)  در مي آيد. بايد متذکر شد که کاربر فعلي به صورت پيش فرض، مجاز به ورود به دامنه عمومي نيست و در صورت لزوم بايد مجوز لازم در فايل Web.Config به صورت زير داده شود:


<webParts>
  <personalization>
    <authorization>
      <allow roles="admin, site_designer" verbs="enterSharedScope" />
    </authorization>
  </personalization>
</webParts>

خاصيتها و شخصي سازي:

وب پارت نيز همانند ديگر کنترلها داراي مجموعه اي از خاصيتها (Properties) مي باشد که مي تواند براي هر شخص يا هر گروه از کاربران خصوصي سازي شود  به عنوان مثال هر وب پارت خاصيتي به نام Title دارد که مي  تواند بعد از اضافه شدن به WebPartZone ، customize شود. کنترل EditorZone از جمله کنترلهايي است که مي توان به کمک آن در خواص WebPart تغييرات ايجاد نمود. زماني که کاربر صفحه وب پارت را در حالت EditDisplayMode  تنظيم مي کند، منوي وب پارت يک دستور ويرايش صادر مي کند.
اضافه کردن خاصيتهاي دلخواه به يک وب پارت کاري ساده است، کافي است خاصيت مورد نظر خود را به کلاس وب پارت اضافه نماييد و ويژگيها (Attribute)هايي از قبيل Personalizable، WebBrowsable وWebDisplayName را به آنها اضافه نماييد. مثال زير چگونگي تعريف يک خاصيت را نشان مي دهد:


private bool _HR = true;
[Personalizable(PersonalizationScope.User),
 WebBrowsable, WebDisplayName("Show HR News"),
 WebDescription("Use this property to show/hide HR news")]
public bool HR
{
  get { return _HR; } set { _HR = value; }
}

اگر مايل هستيد کاربران سايت شما قادر باشند خاصيتي مانند فوق را شخصي سازي کنند کافي است کنترل PropertyGridEditorPart را به داخل EditorZone خود منتقل کنيد.شکل شماره 1 نشان ميدهد که کاربران سايت چگونه شخصي سازي را انجام مي دهند.

کاتالوگهاي وب پارت:

چنانچه بخواهيد به کاربران سايت خود اجازه دهيد تا در زمان اجرا وب پارتهايي را به صفحه اضافه کنند، مي توانيد از يک CatalogZone يا CatalogPart استفاده کنيد. مثال زير اين حالت را نشان مي دهد:


<asp:CatalogZone ID="CatalogZone1" runat="server" >
  <ZoneTemplate>
    <!-- به کاربران اجازه مي دهد وب پارتها را بعد از بسته شدن مجددا بارگذاري کنند   -->
    <asp:PageCatalogPart ID="PageCatalogPart1"
                         runat="server" Title="Local Page Catalog" />
    <!-- به کاربران اجازه مي دهد وب پارتهاي جديدي به صفحه اضافه کنند   -->
    <asp:DeclarativeCatalogPart ID="DeclarativeCatalogPart1"
                                runat="server"
                                Title="Wingtip Web Parts">
      <WebPartsTemplate>
        <cc1:WeatherWebPart ID="WeatherWebPart1"  runat="server"   ZipCode="04090" />
      </WebPartsTemplate>
    </asp:DeclarativeCatalogPart>
  </ZoneTemplate>
</asp:CatalogZone>

زماني که به اين روش يک CatalogZone يا CatalogPart به صفحه اضافه کنيد کاربران سايت قادر خواهند بود همانند شکل 2 به صورت دايناميک وب پارتهايي در صفحه ايجاد کنند.

استفاده از UserControl به جاي وب پارت:


يکي از نقاط ضعف در سرويسهاي windows Sharepoint اين است که شما مجبور هستيد تمام ظاهر کنترل خود را کدنويسي کنيد و به عبارت ديگر نمي توانيد با استفاده از ابزارهاي Designer اين کار را انجام دهيد. به دليل اينکه بسياري از وب پارتها مجموعه اي از کنترلهاي سمت سرور هستند که با يکديگر تعامل دارند.
يکي از راهکارهايي که براي برطرف شدن اين مشکل پيشنهاد مي شود، استفاده از UserControl و يا در واقع ساختن يک UserControl  و استفاده از آن به جاي وب پارت است.
با استفاده از اين روش اگر يک کنترل استاندارد از نوع غير وب پارت به وب پارت زون (WebPartZone)  اضافه شود، به طور ضمني متد WebPartManager.CreateWebPart  فراخواني مي شود که يک نمونه از کلاس GenericWebPart را ساخته و آنرا به وسيله کنترلي که اضافه شده، فعال مي کند.
کلاس  GenericWebPart  از کلاس پايه WebPart مشتق مي شود که پياده سازي خواص اصلي  وب پارت را ايجاد مي نمايد.
در مثال زير صفحه يک وب پارت زون با يک UserControl و يک کنترل استاندارد تقويم  تعريف مي شود، که هر دوي آنها به صورت ضمني در کلاس GenericWebPart در زمان ايجاد  شدن پوشانيده مي شوند.


<%@ Register Src="webparts/CustomerList.ascx" TagName="CustomerList" TagPrefix="Wingtip" %>
<asp:WebPartManager ID=" WebPartManager1" runat="server" />
<asp:WebPartZone ID="WebPartZone1" runat="server" HeaderText="Zone 1">
  <ZoneTemplate>
    <Wingtip:CustomerList runat="server" id="CustomerList" />
    <asp:Calendar runat="server" id="CustomerCalendar" />
  </ZoneTemplate>
</asp:WebPartZone>

چنانچه علاقمند باشيد که اينگونه UserControl ها را در زمان اجرا به مانند WebPart ايجاد کنيد، بايد نمونه اي از UserControl  را به صورت دايناميک بوسيله متد LoadControl ايجاد کرده و به صورت کاملا صريح يک ID منحصر بفرد به آن نسبت دهيد.سپس بايد متد CreateWebPart از شيء WebPartManager  را فراخواني کنيد تا يک نمونه از کلاس GenericWebPart ايجاد شود. در آخر بايد کلاس ايجاد شده را با استفاده از متد AddWebPart به زون مورد نظر خود اضافه نماييد.


// create Web Part instance from User Control file
Control uc = this.LoadControl(@"webparts\CompanyNews.ascx");
uc.ID = "wp2";
GenericWebPart wp2 = WebPartManager1.CreateWebPart(uc);
WebPartManager1.AddWebPart(wp2, WebPartZone1, 1);
 

 يکي از مضرات استفاده از اين روش اين است که شما شانس کنترل خاصيتهاي خاص وب پارت را از دست مي¬دهيد. به دليل اينکه کلاس GenericWebPart از وب پارت به ارث رفته است و نه از کنترل شما.
براي اينکه بتوانيد عليرغم وجود اين مشکل کار خود را ادامه دهيد، اين است که خواص کلاس GenericWebPart را در متد Page_init تنظيم نماييد.


void Page_Init(object src, EventArgs e) {
  GenericWebPart gwp = Parent as GenericWebPart;
  if (gwp != null)  {
    gwp.Title = "My custom user control";
    gwp.TitleIconImageUrl = @"~\img\ALLUSR.GIF";
    gwp.CatalogIconImageUrl = @"~\img\ALLUSR.GIF";
  }
}

در کدي که به ضميمه اين مقاله آمده است، تمامي موارد گفته شده در بالا به انضمام مفاهيم بسيار جالب ديگري پياده سازي گرديده اند که اميد است مورد استفاده قرار بگيرد.