MOSS: Contoh fungsi - Custom Jenis Data

Senario Perniagaan:

Pelaksanaan menyeluruh MOSS syarikat perkilangan dengan 30+ tapak dan terdapat beberapa dozen Jabatan korporat.

Objektif perniagaan:

Meskipun pelbagai Kumpulan Perniagaan (Jabatan-Jabatan, lokasi, dan sebagainya.), Sesetengah data perlu dikekalkan pada tahap global. Sebagai contoh, Senarai induk yang berwibawa di semua lokasi fizikal Syarikat (e.g. Kemudahan perkilangan, lokasi gudang, pejabat jualan) hendaklah dikekalkan di lokasi berpusat.

Masalah teknikal:

Taksonomi enterprise telah dilaksanakan menggunakan pelbagai koleksi tapak. Kami akan senang untuk mencipta senarai lokasi fizikal yang berwibawa dalam senarai WSS tersuai. Kemudian, Bilakah kita perlu mempunyai satu kolum dalam jenis kandungan (atau satu lajur yang ditambah ke senarai atau doc Perpustakaan) yang terkandung di lokasi-lokasi korporat, kami akan membuat satu kolum yang menggunakan "lookup" lansung dan titik ke senarai Induk ini.

Malangnya, lookup datatypes mesti mengakses sumber senarai "tempatan" bermaksud bahawa senarai berwibawa tidak rentang koleksi tapak.

Penyelesaian teknikal:

Melaksanakan jenis data adat baru dilaksanakan berdasarkan SPField dan diwakili sebagai DropDownList di UI ListItems yang mengisi daripada senarai WSS induk.

Kami mencipta koleksi tapak baru dipanggil "http://localhost/EnterpriseData". Tiada, kami mencipta senarai tersuai yang dinamakan "Lokasi-lokasi korporat". Senarai ini hanya menggunakan standard "tajuk" medan kepada mengandungi senarai lokasi korporat yang sebenar.

Salah satu berikut beberapa langkah yang diskret untuk mencipta jenis data adat dalam WSS. Mereka adalah:

  1. Menentukan kelas yang mewarisi dari SPField (salah satu boleh mewarisi daripada bidang-bidang lain jika diperlukan).

Berikut adalah kod yang:

awam kelas XYZZYCorporateLocationField : SPFieldText
{
awam XYZZYCorporateLocationField
(SPFieldCollection bidang, rentetan typeName, rentetan displayName)
: asas(bidang, typeName, displayName) { }

awam XYZZYCorporateLocationField
(SPFieldCollection bidang, rentetan displayName)
: asas(bidang, displayName) { }

awam mengatasi BaseFieldControl FieldRenderingControl
{
mendapatkan
{
BaseFieldControl kawalan = baru XYZZYCorporateLocationFieldControl();
kawalan. FieldName = ini.InternalName;
kembali kawalan;
} //mendapatkan
} // fieldrenderingcontrol

awam mengatasi rentetan GetValidatedString(objek nilai)
{
jika (ini.Diperlukan || nilai. ToString().Adalah sama dengan(Rentetan.Kosong))
{
membuang baru SPFieldValidationException ("Jabatan tidak diperuntukkan.");
}
kembali asas.GetValidatedString(nilai);
} // getvalidatedstring

} // XYZZYCorporateLocation

  1. Menentukan kelas lain yang mewarisi daripada kawalan bidang asas, seperti dalam:

awam kelas XYZZYCorporateLocationFieldControl : BaseFieldControl
{
dilindungi DropDownList XYZZYCorporateLocationSelector;

dilindungi mengatasi rentetan DefaultTemplateName
{
mendapatkan
{
kembali "XYZZYCorporateLocationFieldControl";
}
} // DefaultTemplateName

awam mengatasi objek Nilai
{
mendapatkan
{
EnsureChildControls();
kembali ini.XYZZYCorporateLocationSelector.SelectedValue;
} // mendapatkan
set
{
EnsureChildControls();
ini.XYZZYCorporateLocationSelector.SelectedValue = (rentetan)ini.ItemFieldValue;
} // set
} // mengatasi objek nilai

dilindungi mengatasi membatalkan CreateChildControls()
{

jika (ini.Bidang == Batal || ini.ControlMode == SPControlMode.Paparan)
kembali;

asas.CreateChildControls();

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

jika (ini.XYZZYCorporateLocationSelector == Batal)
membuang baru Pengecualian("RALAT: Tidak dapat memuatkan. Fail ASCX!");

jika (!ini.Page.IsPostBack)
{

menggunakan (SPSite lokasi = baru SPSite("http://localhost/enterprisedata"))
{
menggunakan (SPWeb web = halaman. OpenWeb())
{

SPList currentList = web. Senarai["Lokasi korporat"];

foreach (SPItem XYZZYCorporateLocation dalam currentList.Items)
{
jika (XYZZYCorporateLocation["Tajuk"] == Batal) terus;

rentetan theTitle;
theTitle = XYZZYCorporateLocation["Tajuk"].ToString();

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

} // foreach

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

} // Jika tidak postback yang

} // CreateChildControls

} // XYZZYCorporateLocationFieldControl

Kod di atas pada dasarnya melaksanakan logik untuk menyiapkan DropDownList dengan nilai-nilai daripada senarai tersuai WSS terletak di http://localhost/enterprisedata dan dinamakan "Jabatan korporat".

I kedua-dua kelas yang ditakrif dalam fail tunggal .cs, Ia disusun dan memasukkannya ke dalam GAC dalam (kuat diperlukan, sudah tentu).

  1. Melaksanakan kawalan template (.ascx) seperti yang ditunjukkan:

<%@ Kawalan Bahasa= "C#" Mewarisi="Microsoft.SharePoint.Portal.ServerAdmin.CreateSiteCollectionPanel1,Microsoft.SharePoint.Portal,Versi = 12.0.0.0, budaya = neutral,PublicKeyToken = 71e9bce111e9429c" compilationMode= "Sentiasa" %>
<%
@ Mendaftar Tagprefix= "wssawc" Ruang nama="Microsoft.SharePoint.WebControls" Perhimpunan="Microsoft.SharePoint, Versi = 12.0.0.0, Budaya = neutral, PublicKeyToken = 71e9bce111e9429c" %> <%@ Mendaftar Tagprefix= "SharePoint" Ruang nama="Microsoft.SharePoint.WebControls" Perhimpunan="Microsoft.SharePoint, Versi = 12.0.0.0, Budaya = neutral, PublicKeyToken = 71e9bce111e9429c" %>
<SharePoint:RenderingTemplate ID= "XYZZYCorporateLocationFieldControl" runat= "pelayan">
<Template>
<ASP:DropDownList ID= "XYZZYCorporateLocationSelector" runat= "pelayan" />
</Template>
</
SharePoint:RenderingTemplate>

Di atas akan disimpan ke dalam c:\Program filescommon filesmicrosoft sharedweb server extensions12controltemplates.

  1. Akhirnya, kami mencipta fail XML untuk menyimpan ke dalam... direktori 12XML. Inilah CAML yang mentakrifkan jenis data Kastam kami dan sebagai contoh saya, kelihatan seperti ini:

<?xml versi="1.0" pengekodan="utf-8" ?>
<
FieldTypes>
<
FieldType>
<
Bidang Nama="TypeName">CorporateLocations</Bidang>
<
Bidang Nama="ParentType">Text</Bidang>
<
Bidang Nama="TypeDisplayName">Lokasi-lokasi korporat</Bidang>
<
Bidang Nama="TypeShortDescription">Semua lokasi XYZZY korporat termasuk kemudahan perkilangan atau lain-lain.</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, Budaya = neutral, PublicKeyToken = b0b19e85410990c4</Bidang>
<
RenderPattern Nama="DisplayPattern">
<
Suis>
<
Nyata>
<
Ruangan />
</
Nyata>

<Kes Nilai=""/>

<Default>
<
HTML>
<![CDATA[
<rentang gaya = "warna:Merah"><b>]]>
</
HTML>

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

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

</
Default>
</
Suis>

</
RenderPattern>
</
FieldType>
</
FieldTypes>
Fail XML ini menambah jenis data adat WSS "Perpustakaan" dan perlawanan terhadap GAC itu mempunyai Dewan Undangan.

Setelah semua bit ini berpindah ke tempat, iisreset pada pelayan dan ia harus semua mula bekerja.

3 pemikiran untuk "MOSS: Contoh fungsi - Custom Jenis Data

  1. Alejandro
    Hi Paul,
    mula-mula sekali, Terima kasih untuk artikel ini, kerana ianya sangat menarik. Hanya satu soalan;
    Adakah anda tahu apakah itu posible untuk memberi sejenis bidang adat dalam datasheet paparan senarai dengan betul?
    Kerana setiap jenis bidang adat yang saya cipta itu ditunjukkan sebagai baca-sahaja dalam datasheet view (dan MSDN dalam, contohnya, tidak membantu saya amat :-S).
    Terima kasih
    Balas
  2. Lyndsay
    Digambarkan keluar! Hanya perlu menambah

    menggunakan System.Web.UI;
    menggunakan System.Web.UI.WebControls;

    Balas
  3. Lyndsay

    Saya sedang cuba untuk melaksanakan penyelesaian anda. Walau bagaimanapun saya bukan DropDownList, Saya hanya mempunyai pilihan untuk DropDownChoiceList yang. Adakah anda kebetulan tahu bagaimana untuk menambah item ke dalam DropDownChoiceList? Kita akan menggunakan SharePoint 2007 SP1 dan Visual Studio 2005 SP1.

    Balas

Tinggalkan Jawapan

alamat e-mel anda tidak akan diterbitkan. Ruangan yang diperlukan ditanda *