Informasi dalam artikel ini dikumpulkan dari banyak sumber, jadi saya tidak dapat mencantumkan semuanya. Konten hanya untuk manajemen pengetahuan pribadi.
Windows SharePoint Services v3 dibangun di atas ASP.NET 2.0. Microsoft ASP.NET AJAX 1.0 diluncurkan setelah MOSS, jadi dalam beberapa kasus, terdapat beberapa masalah kompatibilitas antara ASP.NET AJAX dan SharePoint, yang akan diselesaikan di Windows SharePoint Services SP1. Sebelumnya, penggunaan teknologi ASP.NET AJAX di SharePoint memerlukan beberapa langkah penerapan khusus.
Catatan:
Ada batasan penggunaan UpdatePanel di komponen web. Silakan periksa dokumentasi ASP.NET AJAX untuk detailnya. Tidak semua kontrol dapat digunakan di UpdatePanel.
Jika caching keluaran diaktifkan, Anda tidak dapat menggunakan ASP.NET AJAX atau kesalahan akan terjadi. Kontradiksi klasik antara kinerja dan ketepatan waktu.
Manfaat menggunakan teknologi Microsoft ASP.NET AJAX 1.0 di SharePoint:
Pustaka sumber daya skrip klien yang lengkap dapat dibentuk dan beberapa komponen yang dapat digunakan kembali dapat diakumulasikan.
Data layanan web kami dapat ditampilkan menggunakan JSON, dan hasilnya dapat dengan mudah digunakan dalam aplikasi JavaScript/Ajax.
Membangun WebParts menggunakan teknologi dalam ekstensi dapat memberikan gaya yang sangat interaktif, seperti kotak teks dengan fungsi pelengkapan otomatis.
Gunakan UpdatePanel di WebPart untuk mencapai interaksi bebas panggilan balik dan mengurangi jumlah penyegaran halaman.
Berikut ini adalah langkah-langkah persiapan lingkungan sebelum menyebarkan komponen yang menggunakan teknologi Microsoft ASP.NET AJAX 1.0. (Anda hanya perlu menyebarkannya sekali di lingkungan yang baru diinstal, dan Anda tidak perlu menambahkan Webpart nanti)
Unduh dan instal ASP.NET AJAX di server web.
Pertama, Anda harus menginstal "ASP.NET 2.0 AJAX Extensions 1.0 ", yang dapat diunduh dari ajax.asp .net download.
Memperluas web.config SharePoint untuk Microsoft ASP.NET AJAX 1.0
Kita perlu mendaftarkan beberapa entri khusus untuk Ajax. Edit file web.config SharePoint, yang biasanya terletak di direktori berikut:
c:inetpubwwwrootwssvirtualdirectories80
Tambahkan elemen <sectionGroup> ke tag <configSections>: <configSections>
<sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Versi=1.0.61025.0, Budaya=netral, PublicKeyToken=31bf3856ad364e35">
<sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Versi=1.0.61025.0, Budaya=netral, PublicKeyToken=31bf3856ad364e35">
<section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false"allowDefinition="MachineToApplication"/>
<sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Versi=1.0.61025.0, Budaya=netral, PublicKeyToken=31bf3856ad364e35">
<section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Versi=1.0.61025.0, Budaya=netral, PublicKeyToken=31bf3856ad364e35" requirePermission="false"allowDefinition="Di Mana Saja" />
<bagian nama="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Versi=1.0.61025.0, Budaya=netral, PublicKeyToken=31bf3856ad364e35" requirePermission="false"allowDefinition="MachineToApplication" />
<section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Versi=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="false"allowDefinition="MachineToApplication" />
</bagianGrup>
</bagianGrup>
</bagianGrup>
</configBagian>
Tambahkan konten bagian <controls> dalam tag <system.web>/<pages>. <halaman>
<kontrol>
<tambahkan tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Versi=1.0.61025.0, Budaya=netral, PublicKeyToken=31bf3856ad364e35"/>
</kontrol>
</halaman>
Tambahkan konten berikut dalam tag <assemblies> di dalam tag <compilation>: <assemblies>
<tambahkan assembly="System.Web.Extensions, Versi=1.0.61025.0, Budaya=netral, PublicKeyToken=31bf3856ad364e35"/>
</perakitan>
Tambahkan konten berikut di bagian <httpHandlers>: <httpHandlers>
<tambahkan kata kerja = "*" path = "*.asmx" validasi = "false" type = "System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Versi = 1.0.61025.0, Budaya = netral, PublicKeyToken = 31bf3856ad364e35"/>
<tambahkan kata kerja = "*" path = "*_AppService.axd" validasi = "false" type = "System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Versi = 1.0.61025.0, Budaya = netral, PublicKeyToken =31bf3856ad364e35"/>
<tambahkan kata kerja = "GET, HEAD" path = "ScriptResource.axd" type = "System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Versi = 1.0.61025.0, Budaya = netral, PublicKeyToken = 31bf3856ad364e35" validasi = " salah"/>
</httpHandler>
Tambahkan konten registrasi berikut di bagian HttpModules, di bawah semua konten registrasi yang ada <httpModules>
<tambahkan nama="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Versi=1.0.61025.0, Budaya=netral, PublicKeyToken=31bf3856ad364e35"/>
</httpModul>
Di bagian <SharePoint>/<SafeControls>, tambahkan SafeControl untuk namespace System.Web.UI Ekstensi Microsoft Ajax. <Kontrol Aman>
<SafeControl Majelis="System.Web.Extensions, Versi=1.0.61025.0, Budaya=netral, PublicKeyToken=31bf3856ad364e35" Namespace="System.Web.UI" TypeName="*" Safe="True" />
</Kontrol Aman>
Terakhir, tambahkan tag konfigurasi berikut di akhir file web.config, tepat sebelum tag <configuration> penutup.
<sistem.web.ekstensi>
<skrip>
<Layanan web>
<!-- Batalkan komentar pada baris ini untuk mengaktifkan layanan otentikasi. Sertakan requireSSL="true" jika sesuai -->
<!--
<authenticationService diaktifkan="benar" memerlukanSSL = "benar|salah"/>
-->
<!-- Batalkan komentar pada baris ini untuk mengaktifkan layanan profil. Untuk mengizinkan properti profil diambil dan dimodifikasi dalam aplikasi ASP.NET AJAX, Anda perlu menambahkan setiap nama properti ke atribut readAccessProperties dan writeAccessProperties -->
<!--
<profileService diaktifkan="benar"
readAccessProperties = "nama properti1, nama properti2"
writeAccessProperties = "nama properti1, nama properti2" />
-->
</Layanan Web>
<!--
<scriptResourceHandler aktifkanCompression="benar" aktifkanCaching="benar" />
-->
</skrip>
</sistem.web.ekstensi>
<sistem.webServer>
<validasi validasiIntegratedModeConfiguration="false"/>
<modul>
<tambahkan nama="ScriptModule" preCondition="integratedMode" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Versi=1.0.61025.0, Budaya=netral, PublicKeyToken=31bf3856ad364e35"/>
</modul>
<penangan>
<hapus nama="WebServiceHandlerFactory-Integrated" />
<tambahkan nama="ScriptHandlerFactory" kata kerja="*" path="*.asmx" preCondition="integratedMode"
type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Versi=1.0.61025.0, Budaya=netral, PublicKeyToken=31bf3856ad364e35"/>
<tambahkan nama = "ScriptHandlerFactoryAppServices" kata kerja = "*" path = "*_AppService.axd" preCondition = "integratedMode" type = "System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Versi = 1.0.61025.0, Budaya=netral, PublicKeyToken=31bf3856ad364e35"/>
<tambahkan nama="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Budaya =netral, PublicKeyToken=31bf3856ad364e35" />
</penangan>
</sistem.webServer>
Kembangkan menggunakan AjaxBaseWebPart.
Cara termudah untuk menulis WebPart yang menggunakan ekstensi ini adalah dengan mewarisi AjaxBaseWebPart secara langsung yang ditulis oleh orang lain. Di bawah ini adalah yang saya gunakan. Anda juga dapat menggunakan yang lain, atau menulisnya sendiri.
Berikut adalah bagian referensi namespace:
menggunakan Sistem;
menggunakan System.Collections.Generik;
menggunakan Sistem.Teks;
menggunakan Sistem.Web;
menggunakan System.Web.UI.WebControls.WebParts;
menggunakan System.Xml.Serialisasi;
menggunakan Sistem.Web.UI;
menggunakan Microsoft.SharePoint.WebPartPages;
menggunakan Microsoft.SharePoint.Utilities;
menggunakan Sistem.Web.UI.WebControls;
menggunakan Sistem.Gambar;
Berikut ini adalah bagian implementasi dari kelas AjaxBaseWebPart:
/// <ringkasan>
/// Kelas dasar yang mengimplementasikan semua fungsi yang diperlukan untuk menggunakan ekstensi ASP.net Ajax di dalam WSS
/// </ringkasan>
[XmlRoot(Namespace = "Deps.AjaxBaseWebpart")]
kelas abstrak publik AjaxBaseWebpart : Microsoft.SharePoint.WebPartPages.WebPart
{
/*
* Ide dan kode di balik komponen web dasar ini diambil dari postingan blog Erics di:
* http://www.capdes.com/2007/02/ajaxbasepart_easy_aspnet_20_aj.html
* Ini pada dasarnya mengatur keberadaan dan konfigurasi ScriptManager
* yang diperlukan oleh ekstensi ajax ASP.net untuk menangani postback, dll. Komponen web ini juga mencakup
* metode umum untuk menangani kesalahan.
*/
#Deklarasi wilayah
string pribadi _ValidationGroupId;
ValidationSummary pribadi _ErrorContainer;
Manajer Skrip pribadi _AjaxManager;
#endregion
#region Konstruktor
publik AjaxBaseWebpart()
{
}
#endregion
#region Metode
/// <ringkasan>
/// Digunakan untuk menyediakan cara umum untuk menampilkan kesalahan kepada pengguna komponen web saat ini.
/// </ringkasan>
/// <param name="message">Deskripsi kesalahan yang terjadi.</param>
public void RegisterError (pesan string)
{
if (ini.Kontrol.Berisi(_ErrorContainer))
{
//cara menghasilkan id kontrol unik ini digunakan di beberapa komponen web OOB
int Penghitung unik;
if (HttpContext.Current.Items["GetUniqueControlId"] != null)
{
UniqueCounter = (int)HttpContext.Current.Items["GetUniqueControlId"];
}
kalau tidak
{
Penghitung unik = 0;
}
penghitung unik++;
HttpContext.Current.Items["GetUniqueControlId"] = UniqueCounter;
//buat validator khusus untuk mendaftarkan pesan kesalahan saat ini dengan kontrol ValidationSummary
CustomValidator cv = CustomValidator baru();
cv.ID = string.Concat("_Error_", penghitung unik);
cv.ValidationGroup = _ValidationGroupId;
cv.Display = ValidatorDisplay.Tidak Ada;
cv.IsValid = salah;
cv.ErrorMessage = pesan;
this.Controls.Add(cv);
}
kalau tidak
{
//jika RegisterError dipanggil sebelum penggantian CreateChildControls di AjaxBasePart, lalu transfer pengguna ke halaman kesalahan menggunakan SPUTility
SPUtility.TransferToErrorPage("Fungsi CreateChildControls dari AjaxBasePart belum dipanggil. Anda mungkin perlu menambahkan "base.CreateChildControls()" ke bagian atas penggantian CreateChildControls Anda.");
}
}
/// <ringkasan>
/// Perlu dipanggil untuk memastikan bahwa kontrol ValidationSummary terdaftar di halaman. Setiap komponen web anak harus memiliki base.CreateChildControls() di bagian atas penggantian CreateChildControls mereka sendiri.
/// </ringkasan>
penggantian yang dilindungi batal CreateChildControls()
{
base.CreateChildControls();
jika (!ini.Kontrol.Berisi(_ErrorContainer))
{
_ValidationGroupId = Guid.NewGuid().ToString();
_ErrorContainer = ValidationSummary();
_ErrorContainer.ID = "_ErrorContainer";
_ErrorContainer.ValidationGroup = _ValidationGroupId;
_ErrorContainer.BorderStyle = BorderStyle.Solid;
_ErrorContainer.BorderWidth = Unit.Pixel(3);
_ErrorContainer.BorderColor = Warna.Merah;
this.Controls.Add(_ErrorContainer);
}
}
#endregion
#region Acara
/// <ringkasan>
/// Oninit diaktifkan sebelum halaman dimuat. Modifikasi pada halaman yang diperlukan untuk mendukung Ajax dilakukan di sini.
/// </ringkasan>
penggantian terproteksi void OnInit(EventArgs e)
{
base.OnInit(e);
//dapatkan ScriptManager yang ada jika ada di halaman
_AjaxManager = ScriptManager.GetCurrent(halaman ini);
jika (_AjaxManager == null)
{
//buat ScriptManager baru dan EnablePartialRendering
_AjaxManager = ScriptManager baru();
_AjaxManager.EnablePartialRendering = true;
// Memperbaiki masalah dengan postback dan tindakan formulir (DevDiv 55525)
Halaman.ClientScript.RegisterStartupScript(typeof(AjaxBaseWebpart), this.ID, "_spOriginalFormAction = document.forms[0].action;", true);
//tag:"form" att:"onsubmit" val:"return _spFormOnSubmitWrapper( )" memblokir postback async setelah yang pertama
//tidak memanggil "_spFormOnSubmitWrapper()" akan merusak semua postback
//mengembalikan nilai true sepanjang waktu, agak menggagalkan tujuan _spFormOnSubmitWrapper() yaitu memblokir postback berulang, namun memungkinkan Ekstensi MS AJAX berfungsi dengan baik
//ini adalah peretasan yang diharapkan memiliki efek minimal
if (ini.Halaman.Bentuk!= null)
{
string formOnSubmitAtt = this.Page.Form.Attributes["onsubmit"];
if (!string.IsNullOrEmpty(formOnSubmitAtt) && formOnSubmitAtt == "kembalikan _spFormOnSubmitWrapper();")
{
this.Page.Form.Attributes["onsubmit"] = "_spFormOnSubmitWrapper();";
}
//tambahkan ScriptManager sebagai kontrol pertama di Page.Form
//Saya rasa ini tidak penting, tapi saya melakukannya agar konsisten dengan bagaimana Anda seharusnya menempatkan ScriptManager saat digunakan secara deklaratif
this.Page.Form.Controls.AddAt(0, _AjaxManager);
}
}
}
#endregion
#region Properti
/// <ringkasan>
/// Mengekspos pengelola skrip Halaman. Nilainya tidak ditetapkan hingga setelah OnInit
/// </ringkasan>
[Penyimpanan Bagian Web(Penyimpanan.Tidak Ada)]
Manajer Skrip publik AjaxManager
{
dapatkan { kembalikan _AjaxManager }
setel { _AjaxManager = nilai }
}
#wilayah akhir
}
Selama pengembangan, selama Anda mewarisi WebPart ini, Anda bisa menambahkan UpdatePanel dan menambahkan kontrol lain di dalamnya.