Kontrol sumber data adalah jenis kontrol server baru yang diperkenalkan di Microsoft Visual Studio 2005. Kontrol ini merupakan bagian penting dari arsitektur pengikatan data dan dapat menyediakan model pemrograman deklaratif dan perilaku pengikatan data otomatis melalui kontrol pengikatan data. Artikel ini dan artikel selanjutnya dalam seri ini akan memperkenalkan elemen inti penerapan kontrol sumber data.
Pendahuluan
Singkatnya, kontrol sumber data merangkum penyimpanan data dan beberapa operasi yang dapat dilakukan pada data yang ada. Kontrol DataBound dikaitkan dengan kontrol sumber data melalui properti DataSourceID-nya. Sebagian besar penyimpanan data tradisional berbentuk tabel atau hierarki, dan kontrol sumber data dibagi sesuai dengan itu. Yang ingin kami perkenalkan di sini adalah kontrol sumber data dalam format tabel.
Kontrol sumber data itu sendiri tidak berbuat banyak; semua logika dienkapsulasi dalam kelas turunan DataSourceView. Setidaknya satu DataSourceView harus mengimplementasikan fungsi mengambil (yaitu, MEMILIH) sekumpulan baris. Ini dapat menyediakan fungsi memodifikasi data (yaitu INSERT, UPDATE dan DELETE) (opsional). Kontrol terikat data dapat memeriksa kumpulan fitur yang diaktifkan melalui berbagai properti Can???. Kontrol sumber data itu sendiri hanyalah sebuah kontainer untuk satu atau beberapa tampilan dengan nama unik. Berdasarkan konvensi, tampilan default dapat diakses berdasarkan namanya, atau dapat juga kosong. Apakah atau jenis hubungan apa yang ada di antara tampilan yang berbeda dapat ditentukan dengan tepat berdasarkan penerapan setiap kontrol sumber data. Misalnya, kontrol sumber data mungkin menyediakan tampilan terfilter berbeda dari data yang sama melalui tampilan berbeda, atau mungkin menyediakan sekumpulan subbaris dalam tampilan sekunder. Anda dapat menggunakan properti DataMember dari kontrol terikat data untuk memilih tampilan tertentu (jika kontrol sumber data menyediakan beberapa tampilan). Harap perhatikan bahwa saat ini tidak ada kontrol sumber data bawaan di Whidbey yang menawarkan banyak tampilan.
Terakhir, izinkan saya memperkenalkan beberapa konten. Kontrol sumber data (dan tampilannya) menerapkan dua set API. Kumpulan API pertama adalah antarmuka abstrak yang ditentukan untuk empat operasi data umum yang dapat digunakan secara teratur dari kontrol terikat data apa pun. Grup kedua bersifat opsional, didefinisikan berdasarkan domain atau penyimpanan data yang diwakilinya, biasanya bertipe kuat, dan ditujukan untuk pengembang aplikasi.
Contoh
Dalam artikel ini, Anda akan menerapkan WeatherDataSource yang akan bekerja melawan REST (Bahasa Inggris) XML API yang disediakan oleh Weather.com (Bahasa Inggris) untuk mengambil informasi cuaca berdasarkan kode pos. Kontrol sumber data turunan biasanya diterapkan terlebih dahulu.
kelas publik WeatherDataSource : DataSourceControl {
string hanya baca statis publik
CurrentConditionsViewName = "CurrentConditions";
pribadi WeatherDataSourceView _currentConditionsView;
pribadi WeatherDataSourceView CurrentConditionsView {
mendapatkan {
jika (_currentConditionsView == null) {
_currentConditionsView = WeatherDataSourceView baru (ini, CurrentConditionsViewName);
}
kembalikan _currentConditionsView;
}
}
string publik Kode Pos {
mendapatkan {
string s = (string)ViewState["Kode Pos"];
kembali (s != null) ?
}
mengatur {
if (String.Bandingkan(nilai, Kode Pos,
StringComparison.Ordinal) != 0) {
Status Tampilan["Kode Pos"] = nilai;
CurrentConditionsView.RaiseChangedEvent();
}
}
}
penggantian yang dilindungi DataSourceView GetView(string viewName) {
if (String.IsNullOrEmpty(nama tampilan) ||
(String.Bandingkan(nama tampilan, Kondisi Saat IniNama Tampilan,
StringComparison.OrdinalIgnoreCase) == 0)) {
kembalikan Tampilan Kondisi Saat Ini;
}
melempar ArgumentOutOfRangeException baru("viewName");
}
penggantian yang dilindungi ICollection GetViewNames() {
kembalikan string baru[] { CurrentConditionsViewName };
}
Cuaca publik GetWeather() {
kembalikan CurrentConditionView.GetWeather();
}
}
Seperti yang Anda lihat, ide dasarnya adalah mengimplementasikan GetView untuk mengembalikan instance tampilan bernama, dan GetViewNames untuk mengembalikan kumpulan tampilan yang tersedia.
Di sini pilih Turunkan dari DataSourceControl. Satu hal yang tidak mudah untuk diperhatikan adalah bahwa kontrol terikat data sebenarnya mencari antarmuka IDataSource, dan kontrol DataSource mengimplementasikan antarmuka dengan mengimplementasikan GetView dan GetViewNames. Alasan mengapa antarmuka diperlukan adalah untuk mengaktifkan kontrol sumber data menjadi tabel dan hierarki (jika memungkinkan, dalam hal ini berasal dari model utama dan mengimplementasikan model lain sebagai antarmuka). Kedua, ini juga memungkinkan kontrol lain diubah dalam berbagai skenario untuk menggandakan kapasitas sumber data. Perhatikan juga properti ZipCode publik dan metode GetWeather yang mengembalikan objek Weather yang diketik dengan kuat. API ini cocok untuk pengembang halaman. Pengembang halaman tidak perlu memikirkan DataSourceControl dan DataSourceView.
Langkah selanjutnya adalah mengimplementasikan tampilan sumber data itu sendiri. Contoh khusus ini hanya menyediakan fungsionalitas tingkat SELECT (yang merupakan persyaratan minimum dan satu-satunya fungsionalitas yang berguna dalam skenario ini).
kelas tersegel pribadi WeatherDataSourceView : DataSourceView {
private WeatherDataSource _owner;
public WeatherDataSourceView (pemilik WeatherDataSource, string viewName)
: base(pemilik, nama tampilan) {
_pemilik = pemilik;
}
penggantian yang dilindungi IEnumerable ExecuteSelect(
Argumen DataSourceSelectArguments) {
argument.RaiseUnsupportedCapabilitiesError(ini)
;
kembalikan Cuaca baru[] { objek cuaca };
}
Cuaca internal GetWeather() {
string kode pos = _pemilik.kode pos;
if (kode zip.Panjang == 0) {
melempar InvalidOperationException();
}
WeatherService WeatherService = Layanan Cuaca baru (Kode Pos);
kembalikan WeatherService.GetWeather();
}
kekosongan internal RaiseChangedEvent() {
OnDataSourceViewChanged(EventArgs.Empty);
}
}
Secara default, kelas DataSourceView mengembalikan false dari properti seperti CanUpdate dan menampilkan NotSupportedException dari Update dan metode terkait. Satu-satunya hal yang perlu Anda lakukan di sini di WeatherDataSourceView adalah mengganti metode abstrak ExecuteSelect dan mengembalikan IEnumerable yang berisi data cuaca "yang dipilih". Dalam implementasinya, kelas pembantu WeatherService digunakan, yang hanya menggunakan objek WebRequest untuk menanyakan cuaca.com (dalam bahasa Inggris) menggunakan kode pos yang dipilih (tidak ada yang istimewa tentang itu).
Anda mungkin memperhatikan bahwa ExecuteSelect ditandai sebagai dilindungi. Apa yang sebenarnya dipanggil oleh kontrol terikat data adalah metode Pilih publik (dan tersegel) yang diteruskan dalam panggilan balik. Implementasi Select memanggil ExecuteSelect dan memanggil callback dengan instance IEnumerable yang dihasilkan. Pola ini sangat aneh. Ada alasannya, yang akan dijelaskan pada artikel selanjutnya di seri ini. Mohon tunggu...
Berikut ini contoh penggunaannya:
Kode Pos: <asp:TextBox runat="server" id="zipCodeTextBox" />
<asp:Button runat="server" onclick="OnLookupButtonClick" Text="Lihat" />
<jam />
<asp:FormView runat="server" DataSourceID="weatherDS">
<Templat Barang>
<asp:Label runat="server"
Text='<%# Eval("Suhu", "Suhu saat ini adalah {0}.") %>' />
</Templat Barang>
</asp:Tampilan Formulir>
<nk:WeatherDataSource runat="server" id="weatherDS" ZipCode="98052" />
<script runat="server">
private void OnLookupButtonClick(pengirim objek, EventArgs e) {
cuacaDS.ZipCode = zipCodeTextBox.Text.Trim();
}
</script>
Kode ini menyetel kode pos sebagai respons terhadap masukan pengguna, yang menyebabkan sumber data mengeluarkan pemberitahuan perubahan, menyebabkan kontrol FormView terikat melakukan pengikatan data dan mengubah tampilan.
Sekarang, kode akses data dienkapsulasi dalam kontrol sumber data. Selain itu, model ini memungkinkan Weather.com (dalam bahasa Inggris) untuk menerbitkan komponen yang juga dapat merangkum detail khusus untuk layanannya. Semoga berhasil. Selain itu, antarmuka sumber data abstrak memungkinkan FormView bekerja hanya dengan data cuaca.
Di artikel berikutnya, Anda akan menyempurnakan kontrol sumber data untuk secara otomatis menangani perubahan pada nilai filter (yaitu, kode pos) yang digunakan untuk mengkueri data.