MOSS 2007: Some Caveats in WebPart Development

English (Indonesian version)

WebPart creation is just analogous with the one for server controls. Any child controls in the webpart must be added programatically throughout the code (no design time GUIs) – and also for the layouts. Simply, what we do on server controls development are bringed into webpart development – the difference is webparts inheriting from System.Web.UI.WebControls.WebPart or Microsoft.SharePoint.WebPartPages.WebPart instead of System.Web.UI.WebControls.WebControl . However, there are some ceveats if you start developing webparts. If someday you ever encounter these symptoms, it might be because one of these reasons:

  1. Symptom, you are successfully developing webpart by gradually adding features and deploy the assembly into bin directory. However when you try to install it into production server, the Sharepoint can not import the web part; showing following error message.

    ImportError

    Possible reasons, the web part class contains explicits class contructors.
    Developers might create simple web part at the first time to see how it works, and then add some more functionalities time to time. The simple web part can be added to the web page sucessfully – and he/she add class contructor without any problem. This could be happened because, after the web part becomes child control of the web page – it will follow normal loading sequence (contruct – init – load – render). However, if it’s first imported to the page an error will be presented to the users.

    Resolution, avoids using explicits class constructors in web part class.

  2. Symptom, web part are displayed correctly in web page, but it rendered as “object reference not found” in designer

    Editor

    Possible reasons, some object are contructed in OnInit() timing event.
    Objects in web part can be created in CreateChildControls() or for some reason the developers need to put it in OnInit() timing event. Creating object in CreateChildControls() maintains it state, in contrast with creating objects in OnInit(). For example, if text box control is constructed n CreateChildControls() then the text will be preserved during postback events. Web part in web page follows normal loading sequence, however in the designer OnInit() will be neglected by the designer rendering tools.

    Resolution, check the DesignMode property of the web part and add necessary object contructor statement in CreateChildControls() ;
    Microsoft suggest us to implement the IDesignTimeHtmlProvider interface, which means we need to implement GetDesignTimeHtml() method.

  3. Symptom, web part assembly is strong named and its already “<SafeControls.. ” list of web.config. However, when you try to add it in site collection the web part is not listed.

    Possible reasons, by default Visual Studio 2005 creates private class. So, if you create new class and add inheritance from webpart class, it still private class. A private class can not be listed in web part catalog of site collection.

    Resolution, add public modifier to the web part class.

At last, if you create web part – always try full cycle loading. Delete and add the web part from web page before delivering to the user.

–o0o–

Indonesia (versi English)

Membuat web part sangat mirip dengan teknik yang digunakan untuk membuat server control. Control-control yang akan ditambahkan kedalam web part harus ditambahkan secara programatik melalui code (karena tidak ada tool untuk GUI). Begitu pula ketika kita menginginkan layout tertentu pada web part, maka semua harus dilakukan secara manual melalui code. Tapi pada prinsipnya, apa yang kita lakukan pada saat membuat web server control juga dilakukan pada saat membuat web part – bedanya web part diturunkan dari System.Web.UI.WebControls.WebPart atau Microsoft.SharePoint.WebPartPages.WebPart dan bukan System.Web.UI.WebControls.WebControl. Namun, ada beberapa hal yang harus diperhatikan jika Anda baru memulai membuat web part. Ada beberapa jebakan yang biasanya dialami oleh rekan-rekan yang baru memulai project web part, misalnya:

  1. Gejala, fungsi-fungsi tambahan dapat ditambahkan pada web part yang sudah diinstall dengan tanpa masalah. Akan tetapi ketika web part tersebut akan diinstall ke tempat lain, muncul error yang menyebutkan bahwa web part tidak dapat diimport. Begitu pula, ketika web part di development dihapus dan akan ditambahkan kembali, muncul pesan error yang sama sebagai berikut,

    ImportError

    Kemungkinan penyebabnya, web part tersebut memiliki konstruktor yang eksplisit.
    Pada saat awal, web part mungkin dibuat dengan sangat sederhana hanya untuk melihat cara kerjanya. Lalu, web part tersebut ditambahkan kedalam halaman web dan tampil dengan tanpa masalah. Kemudian, seiring dengan waktu beberapa fungsi ditambahkan dan hasilnya langsung dilihat pada web part yang sudah ada didalam halaman web. Developer juga mungkin menambahkan konstruktur eksplisit tanpa masalah. Ini terjadi karena web part yang sudah menempel di halaman web akan mengikuti urutan eksekusi yang normal (construct – init – load – render). Akan tetapi, jika web part tersebut tidak dapat ditambahkan ke halaman web yang lain.

    Resolusi, hindari pendefinisian konstruktor eksplisit untuk web part.

  2. Gejala, web part tampil normal di web page, namun ketika web page dibuka dengan designer muncul pesan “object reference not found”

    Editor

    Kemungkinan penyebabnya, pengaturan property untuk object/control yang dibuat di method OnInit() dilakukan dengan menggunakan nilai dari property webpart.
    Biasanya konstruksi object/control dilakukan didalam CreateChildControls() namun kadangkala untuk alasan tertentu, developer harus meletakkannya di OnInit(). Ketika halaman berada pada urutan OnInit(), property webpart belum diwujudkan didalam object webpart tersebut. Sehingga, pada dasarnya pengaksesan property itu pada saat OnInit() akan menimbulkan kesalahan ‘object reference not found’ .

    Resolusi, pindahkan urutan pengaturan property didalam method CreateChildControls() atau RenderWebPart(). Lebih jauh menurut Microsoft, kita harus mengimplementasikan interface IDesignTimeHtmlProvider, dan dengan kata lain harus menambahkan method GetDesignTimeHtml() didalam webpart yang kita buat.

  3. Gejala, assembly web part sudah memenuhi standard strong name. Isi “<SafeControls.. ” di dalam web.config sudah ditambah dengan text yang sesuai. Namun, pada saat akan menambahkan web part kedalam site collection, tidak ditemukan nama web part yang dimaksud.

    Kemungkinan penyebabnya, secara default Visual Studio 2005 akan membuat class privat. Jadi, meskipun class tersebut sudah diturunkan dari class webpart, namun masih merupakan class private. Sebuah class private tidak dapat ditampilkan didalam web part catalog yang ada didalam site collection.

    Resolusi, tambahkan modifier public kedalam class web part.

Sebagai pedoman terakhir, jika Anda membuat sebuah web part – jangan lupa untuk selalu mencobanya secara lengkap. Hapus dan tambahkan web part dari web page serta cobalah untuk membuka halaman tersebut didalam designer.

About

Riwut Libinuko, experienced Architect. Currently working with Credit Agricole CIB, responsible for SharePoint platform in Asia Pasific. . Certification: SharePoint 2013, SharePoint 2010, SharePoint 2007, ITiL v3

Posted in General, Office 12, Office Server 2007, Tips and Tricks

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: