MOSS: Contoh fungsional-jenis Data kustom

Bisnis skenario:

Perusahaan-lebar pelaksanaan MOSS untuk perusahaan manufaktur dengan 30+ situs dan beberapa lusin Departemen.

Tujuan bisnis:

Meskipun banyak kelompok bisnis (Departemen, Lokasi, dll), data tertentu harus dipelihara di tingkat global. Misalnya, Daftar master otoritatif semua lokasi fisik perusahaan (misalnya. Fasilitas manufaktur, lokasi gudang, kantor penjualan) harus dipelihara dalam lokasi.

Masalah teknis:

Taksonomi enterprise dilaksanakan menggunakan situs beberapa koleksi. Kami akan senang untuk membuat daftar otoritatif lokasi fisik di WSS daftar kustom. Kemudian, Ketika kita diperlukan untuk memiliki sebuah kolom di jenis konten (atau kolom yang ditambahkan ke daftar atau doc Perpustakaan) yang berisi lokasi perusahaan, kita akan menciptakan sebuah kolom yang menggunakan "lookup" DataType dan titik ini master daftar.

Sayangnya, lookup datatypes harus mengakses sumber daftar "lokal" berarti bahwa daftar otoritatif kami tidak meliputi koleksi situs.

Solusi teknis:

Menerapkan tipe data kustom baru dilaksanakan berdasarkan SPField dan diwakili sebagai DropDownList di UI ListItems yang mengisi dari daftar WSS master.

Kami membuat kumpulan situs baru yang disebut "http://localhost/EnterpriseData". Ada, kami membuat daftar kustom bernama "Perusahaan lokasi". Daftar ini hanya menggunakan standar "judul" bidang berisi daftar lokasi perusahaan aktual.

Seseorang mengikuti beberapa langkah diskrit untuk membuat kustom data jenis di WSS. Mereka:

  1. Mendefinisikan kelas yang mewarisi SPField (satu mungkin mewarisi dari bidang lain jika diperlukan).

Berikut adalah kode untuk itu:

Umum kelas XYZZYCorporateLocationField : SPFieldText
{
Umum XYZZYCorporateLocationField
(SPFieldCollection bidang, string typeName, string displayName)
: Base(bidang, typeName, displayName) { }

Umum XYZZYCorporateLocationField
(SPFieldCollection bidang, string displayName)
: Base(bidang, displayName) { }

Umum override BaseFieldControl FieldRenderingControl
{
mendapatkan
{
BaseFieldControl kontrol = baru XYZZYCorporateLocationFieldControl();
kontrol. Nama field tidak dikenal = ini.InternalName;
kembali kontrol;
} //mendapatkan
} // fieldrenderingcontrol

Umum override string GetValidatedString(objek nilai)
{
Jika (ini.Diperlukan || nilai. ToString().Sama dengan(String.Kosong))
{
melempar baru SPFieldValidationException ("Departemen tidak diberikan.");
}
kembali Base.GetValidatedString(nilai);
} // getvalidatedstring

} // XYZZYCorporateLocation

  1. Mendefinisikan kelas lain yang mewarisi dari kontrol dasar bidang, seperti dalam:

Umum kelas XYZZYCorporateLocationFieldControl : BaseFieldControl
{
dilindungi DropDownList XYZZYCorporateLocationSelector;

dilindungi override string DefaultTemplateName
{
mendapatkan
{
kembali "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

Umum override objek Nilai
{
mendapatkan
{
EnsureChildControls();
kembali ini.XYZZYCorporateLocationSelector.SelectedValue;
} // mendapatkan
set
{
EnsureChildControls();
ini.XYZZYCorporateLocationSelector.SelectedValue = (string)ini.ItemFieldValue;
} // set
} // menimpa objek nilai

dilindungi override Batal CreateChildControls()
{

Jika (ini.Bidang == null || ini.ControlMode == SPControlMode.Tampilan)
kembali;

Base.CreateChildControls();

ini.XYZZYCorporateLocationSelector =
(DropDownList)TemplateContainer.FindControl("XYZZYCorporateLocationSelector");

Jika (ini.XYZZYCorporateLocationSelector == null)
melempar baru Pengecualian("KESALAHAN: Tidak dapat memuat. ASCX file!");

Jika (!ini.Halaman IsPostBack.)
{

menggunakan (SPSite situs = baru SPSite("http://localhost/enterprisedata"))
{
menggunakan (SPWeb Web = site. OpenWeb())
{

SPList currentList = web. Daftar["Lokasi perusahaan"];

foreach (SPItem XYZZYCorporateLocation dalam currentList.Items)
{
Jika (XYZZYCorporateLocation["Judul"] == null) «««;

string theTitle;
theTitle = XYZZYCorporateLocation["Judul"].ToString();

ini.XYZZYCorporateLocationSelector.Items.Add
(baru ListItem(theTitle, theTitle));

} // foreach

} // menggunakan spweb web = site.openweb()
} // menggunakan spsite site = new spsite("http://localhost/enterprisedata")

} // Jika tidak postback

} // CreateChildControls

} // XYZZYCorporateLocationFieldControl

Kode di atas pada dasarnya mengimplementasikan logika untuk mempopulasikan DropDownList dengan nilai-nilai dari daftar kustom WSS terletak di http://localhost/enterprisedata dan bernama "Departemen perusahaan".

Aku didefinisikan kedua kelas dalam file tunggal dialokasikan, ini dikompilasi dan memasukkannya ke dalam GAC (kuat diperlukan, Tentu saja).

  1. Menerapkan template kontrol (.ascx) seperti yang ditunjukkan:

<%@ Kontrol Bahasa= "C#" Mewarisi="Microsoft.SharePoint.portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.portal,Versi = 12.0.0.0, Culture = neutral,PublicKeyToken = 71e9bce111e9429c" compilationMode= "Selalu" %>
<%
@ Daftar Tagprefix= "wssawc" Namespace="Microsoft.SharePoint.WebControls" Majelis="Microsoft.SharePoint, Versi = 12.0.0.0, Culture = neutral, PublicKeyToken = 71e9bce111e9429c" %> <%@ Daftar Tagprefix= "SharePoint" Namespace="Microsoft.SharePoint.WebControls" Majelis="Microsoft.SharePoint, Versi = 12.0.0.0, Culture = neutral, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:RenderingTemplate ID= "XYZZYCorporateLocationFieldControl" runat= "server">
<Template>
<ASP:DropDownList ID= "XYZZYCorporateLocationSelector" runat= "server" />
</Template>
</
SharePoint:RenderingTemplate>

Atas disimpan ke c:\Program filescommon program sharedweb server extensions12controltemplates.

  1. Akhirnya, kami menciptakan sebuah file XML untuk menyimpan ke... 12XML direktori. Ini adalah CAML yang mendefinisikan tipe data kustom kami dan sebagai contoh saya, terlihat seperti ini:

<?XML Versi="1.0" encoding="utf-8" ?>
<
FieldTypes>
<
FieldType>
<
Bidang Nama="TypeName">CorporateLocations</Bidang>
<
Bidang Nama="ParentType">Teks</Bidang>
<
Bidang Nama="TypeDisplayName">Lokasi perusahaan</Bidang>
<
Bidang Nama="TypeShortDescription">Semua perusahaan tidak ada lokasi termasuk fasilitas manufaktur atau lainnya.</Bidang>
<
Bidang Nama="UserCreatable">BENAR</Bidang>
<
Bidang Nama="ShowInListCreate">BENAR</Bidang>
<
Bidang Nama="ShowInDocumentLibraryCreate">BENAR</Bidang>
<
Bidang Nama="ShowInSurveyCreate">BENAR</Bidang>
<
Bidang Nama="ShowInColumnTemplateCreate">BENAR</Bidang>
<
Bidang Nama="FieldTypeClass">Conchango.XYZZYCorporateLocationField, XYZZYCorporateLocationField, Versi = 1.0.0.0, Culture = neutral, PublicKeyToken = b0b19e85410990c4</Bidang>
<
RenderPattern Nama="DisplayPattern">
<
Switch>
<
Expr>
<
Kolom />
</
Expr>

<Kasus Nilai=""/>

<Standar>
<
HTML>
<![CDATA[
<span gaya = "warna:Merah"><b>]]>
</
HTML>

<
Kolom SubColumnNumber="0" HTMLEncode="BENAR"/>

<HTML><![CDATA[</b></rentang>]]></HTML>

</
Standar>
</
Switch>

</
RenderPattern>
</
FieldType>
</
FieldTypes>
File XML ini menambah tipe data kustom WSS "Perpustakaan" dan pertandingan melawan GAC telah Majelis.

Setelah semua bit ini pindah ke tempatnya, iisreset pada server dan itu harus semua mulai bekerja dengan baik.

3 pemikiran tentang “MOSS: Contoh fungsional-jenis Data kustom

  1. Alejandro
    Hi Paulus,
    Pertama-tama, Terima kasih untuk artikel, karena sangat menarik. Hanya satu pertanyaan;
    Apakah Anda tahu apakah posible untuk membuat benar jenis bidang kustom dalam datasheet tampilan daftar?
    Karena setiap jenis bidang kustom yang membuat itu ditampilkan sebagai read only dalam datasheet tampilan (dan MSDN, misalnya, tidak membantu saya sangat banyak :-S).
    Terima kasih
    Balasan
  2. Dariratnasaripky

    Saya mencoba untuk menerapkan solusi Anda. Namun saya bukan DropDownList, Saya hanya memiliki pilihan untuk DropDownChoiceList. Apakah Anda kebetulan tahu bagaimana untuk menambahkan item ke DropDownChoiceList? Kami menggunakan SharePoint 2007 SP1 dan Visual Studio 2005 SP1.

    Balasan

Tinggalkan balasan

Alamat email Anda tidak akan dipublikasikan. Bidang yang harus diisi ditandai *