Kirim tanpa ampun asp. Postback data otomatis

Membentuk

Keluarga Membentuk Mengambil nilai elemen formulir yang dikirim dalam badan permintaan HTTP menggunakan formulir yang menggunakan metode POST.

Sintaksis

Form Permintaan(elemen) [(indeks) |.Menghitung]

Pilihan

elemen

Nama elemen bentuk dari mana keluarga mengambil nilai.

indeks

Parameter opsional yang memungkinkan akses ke salah satu dari beberapa nilai parameter. Bisa bilangan bulat antara -1 dan Form Permintaan(parameter).Menghitung.

Catatan

Keluarga Membentuk diindeks oleh nama parameter di badan permintaan. Arti Form Permintaan(elemen) adalah array dari semua nilai elemen, yang muncul di isi permintaan. Anda dapat menentukan jumlah nilai parameter dengan menelepon Form Permintaan(elemen).Menghitung. Jika parameter tidak memiliki banyak nilai yang terkait dengannya, penghitungnya adalah 1. Jika parameter tidak ditemukan, penghitungnya adalah 0.

Untuk merujuk ke satu nilai elemen formulir yang memiliki banyak nilai, Anda harus menentukan nilai untuk indeks. Parameter indeks bisa sembarang angka antara 1 dan 1 Form Permintaan(elemen).Menghitung. Jika salah satu dari beberapa parameter formulir direferensikan tanpa nilai indeks, data dikembalikan sebagai string yang dipisahkan koma.

Kapan Form Permintaan digunakan dengan parameter, server web mem-parsing isi permintaan HTTP dan mengembalikan data yang ditentukan. Jika aplikasi Anda memerlukan data yang tidak diurai dari formulir, Anda dapat mengaksesnya dengan menelepon Form Permintaan tanpa parameter.

Catatan. Saat bekerja dengan ASP dan mengirim data dalam jumlah besar melebihi 100 KB, metodenya Form Permintaan tidak dapat digunakan. Jika aplikasi Anda perlu mengirimkan data melebihi batas ini, Anda dapat membuat kacang yang menggunakan Request.BinaryRead.

Dimungkinkan untuk mengulangi semua nilai data dalam permintaan formulir. Misalnya, jika pengguna mengisi formulir dengan memberikan dua nilai, Cokelat dan Butterscotch, untuk elemen FlavourFavorit, Anda dapat mengekstrak nilai tersebut menggunakan skrip di bawah ini.

For i = 1 To Request.Form("FavoriteFlavour").Count

Response.Write Request.Form("FavoriteFlavour")(i) & "
"

Skrip di atas akan menampilkan informasi berikut.

Anda dapat menggunakan teknik ini untuk menampilkan nama parameter, seperti yang ditunjukkan pada skrip di bawah ini.

Untuk i = 1 ke Request.Form("FavoriteFlavour").count %>

Permintaan.Form(Rasa Favorit) =<%= Request.Form("FavoriteFlavor")(i)_
%>

Skrip ini akan menampilkan yang berikut di browser:

Request.Form(Flavor Favorit) = Cokelat

Request.Form(Flavor Favorit) = Butterscotch

Contoh

Pertimbangkan bentuk berikut:

Nama pertama Anda:

Apa rasa es krim favorit mu:

Badan permintaan berikut dapat diteruskan dari formulir ini:

firstname=James&flavor=Rocky+Jalan

Skrip di bawah ini kemudian dapat digunakan:

selamat datang,<%= Request.Form("firstname") %>.

Rasa favorit Anda adalah<%= Request.Form("flavor") %>.

Hasilnya akan terlihat seperti ini:

Selamat datang, James. Rasa favorit Anda adalah Rocky Road.

Jika Anda menggunakan skrip di bawah ini:

Data formulir yang tidak diurai adalah:<%= Request.Form %>

hasilnya akan terlihat seperti ini:

Data formulir yang tidak diurai adalah: firstname=James&flavor=Rocky+Road

Catatan. Jika formulir menyertakan beberapa objek dengan nama yang sama (seperti tag SELECT HTML), elemen dalam keluarga formulir akan menjadi daftar yang dipisahkan koma dari semua nilai yang dipilih.

Area aplikasi

Lihat juga

Sertifikat Klien _Sertifikat Klien, Kue _Cookies_Permintaan, QueryString _QueryString, Variabel Server _ServerVariables

Model ASP.NET

Formulir HTML

Mereka yang terbiasa dengan bahasa HTML paling tahu itu dengan cara sederhana pengiriman data klien ke server adalah dengan menggunakan pegangan . Di dalam pegangan deskriptor dapat ditempatkan mewakili orang lain elemen dasar antarmuka pengguna seperti tombol, bidang teks, kotak daftar, dan tombol radio.

Misalnya, di bawah ini adalah halaman HTML dengan formulir yang berisi dua kolom teks, dua kotak centang, dan tombol kirim, mis. hanya lima deskriptor :

Survei

Masukkan nama Anda:
Masukkan nama belakang:

Apa yang Anda pemrograman?
C#
VB.NET



Gambar tersebut menunjukkan bagaimana tampilan halaman sederhana ini di jendela browser web:

Saat pengguna mengklik tombol Kirim, browser mengambil nilai saat ini dari setiap kontrol dan membentuk string panjang darinya. String ini kemudian dikirim ke halaman yang ditentukan di handle

(dalam hal ini page.aspx) menggunakan operasi HTTP POST. Dalam contoh ini, ini berarti server web dapat menerima permintaan dengan baris informasi berikut:

FirstName=Vasily&LastName=Pupkin&CS=aktif&VB=aktif

Saat membuat string ini, browser mengikuti aturan tertentu. Informasi selalu dikirim sebagai urutan pasangan nama/nilai yang dipisahkan oleh tanda ampersand (&). Dalam pasangan, nama dipisahkan dari nilai dengan tanda sama dengan (=). Kotak centang diabaikan sampai dipilih, dalam hal ini browser meneruskan teks sebagai nilainya. Informasi lengkap tentang standar formulir HTML yang didukung di setiap browser saat ini dapat ditemukan di W3C - Formulir.

Hampir semua kerangka kerja pemrograman sisi server menambahkan lapisan abstraksi ke data bentuk mentah. Mereka memecah barisan itu dan menyajikannya dengan cara yang lebih bermanfaat. Misalnya, JSP, ASP, dan ASP.NET memungkinkan Anda mengambil nilai kontrol formulir menggunakan lapisan objek tipis. Di ASP dan ASP.NET, nilai dapat dicari berdasarkan nama Request.Form koleksi. Jika kita mengonversi halaman sebelumnya ke Formulir Web ASP.NET, maka pendekatan ini dapat diterapkan dengan kode seperti ini:

String firstName = Request.Form["FirstName"];

"Lapisan" tipis di atas pesan POST ini berguna, tetapi masih jauh dari struktur berorientasi objek yang sebenarnya. Itu sebabnya ASP.NET mengambil satu langkah lebih jauh. Saat halaman diposting kembali ke lingkungan ASP.NET, halaman tersebut mengambil nilai, mengisi kumpulan Formulir (untuk kompatibilitas mundur dengan kode ASP), lalu mengonfigurasi objek kontrol yang sesuai. Ini berarti sintaks yang jauh lebih bermakna berikut ini dapat digunakan untuk mengambil informasi dari Formulir Web ASP.NET:

String NamaPertama = txtNamaPertama.Teks;

Kode ini juga memiliki manfaat keamanan jenis. Dengan kata lain, saat Anda mengambil status kotak centang, Anda akan mendapatkan nilai boolean true atau false, bukan kata aktif. Akibatnya, pengembang diisolasi dari fitur individual sintaks HTML.

Di ASP.NET, semua kontrol ditempatkan di pegangan terpisah. . Pegangan ini ditandai dengan atribut runat="server", yang memungkinkannya berjalan di server. ASP.NET tidak mengizinkan pembuatan Formulir Web yang berisi lebih dari satu pegangan server , meskipun dimungkinkan untuk membuat halaman yang mengirim informasi ke halaman lain menggunakan teknologi pengiriman lintas halaman.

Antarmuka pengguna yang dinamis

Tidak diragukan lagi, model kontrol memudahkan untuk mengekstraksi informasi tentang formulir. Yang lebih luar biasa lagi, itu membuat hidup lebih mudah saat Anda perlu menambahkan informasi ke halaman. Hampir semua properti kontrol web dapat dibaca dan diatur. Ini berarti, misalnya, properti Teks dari bidang teks dapat disetel semudah membacanya.

Misalnya, pertimbangkan apa yang terjadi jika Anda akan memperbarui sepotong teks di halaman web untuk mencerminkan beberapa informasi yang sebelumnya dimasukkan oleh pengguna. Di ASP klasik, Anda perlu menemukan tempat yang nyaman untuk memasukkan blok skrip yang menulis kode HTML. Berikut ini adalah cuplikan kode ASP.NET yang menggunakan teknik ini untuk menampilkan pesan selamat datang berwarna cerah:

Pesan string = " Selamat datang " + txtFirstName.Teks + " " + txtLastName.Teks + ""; Tanggapan.Tulis(pesan);

Di sisi lain, situasinya disederhanakan saat menentukan kontrol Label (label) di ASP.NET:

Sekarang Anda bisa mengatur propertinya:

Label1.Text = "Selamat Datang" + txtFirstName.Text + " " + txtLastName.Text; Label1.ForeColor = Warna.Merah;

Kode ini memiliki beberapa keunggulan. Pertama, jauh lebih mudah untuk menulis (dan tanpa kesalahan). Dalam contoh ini, penghematan dapat diabaikan, tetapi menjadi cukup signifikan jika kita memperhitungkannya halaman penuh ASP.NET yang perlu secara dinamis memodifikasi blok HTML kompleks yang berisi tautan, gambar, dan gaya.

Kedua, kode berbasis kontrol juga lebih mudah ditempatkan di dalam halaman. Anda dapat menulis kode ASP.NET di mana pun tindakan terkait terjadi. Di sisi lain, dalam kasus ASP klasik, Anda harus menjaga tata letak konten pada halaman dan penempatan kode blok skrip yang sesuai. Jika sebuah halaman berisi wilayah dinamis, itu bisa menjadi blok skrip yang berantakan yang tidak terkait dan rusak.

Keuntungan lain (kurang terlihat, tetapi lebih signifikan) dari model kontrol adalah cara menyembunyikan detail HTML tingkat rendah. Ini tidak hanya memungkinkan untuk menulis kode tanpa mempelajari semua spesifikasi HTML, tetapi juga memungkinkan halaman untuk mendukung lebih banyak browser. Karena kontrol merender dirinya sendiri, ia memiliki kemampuan untuk menyesuaikan outputnya untuk mendukung browser yang berbeda, fitur sisi klien tingkat lanjut, atau bahkan standar terkait HTML lainnya seperti XHTML atau WML. Dengan demikian, kode tidak lagi terikat langsung dengan standar HTML.

Model Peristiwa ASP.NET

Teknologi ASP klasik menggunakan model linier pengolahan. Artinya, kode halaman diproses dari awal hingga akhir dan dieksekusi secara berurutan. Karena model ini, pengembang yang menggunakan teknologi ASP klasik harus menulis kode dalam jumlah yang layak bahkan untuk halaman sederhana.

Contoh tipikal dari hal ini adalah halaman web yang berisi tiga tombol kirim berbeda untuk tiga operasi berbeda. Dalam kasus seperti itu, kode skrip harus membedakan dengan jelas tombol mana yang diklik saat mengirimkan halaman, lalu menentukan dan melakukan tindakan yang sesuai berdasarkan logika kondisional.

ASP.NET membuat segalanya lebih mudah dengan menawarkan model pemrosesan berbasis peristiwa. Dalam model ini, pengembang terlebih dahulu menambahkan kontrol ke Formulir Web, lalu memutuskan peristiwa mana yang ingin mereka tanggapi. Setiap event handler adalah metode terpisah, membuat kode halaman terlihat rapi dan teratur.

Model ini bukanlah hal baru, tetapi sebelum munculnya ASP.NET, model ini digunakan secara eksklusif di bidang pemrograman antarmuka pengguna berjendela untuk aplikasi klien yang kaya. Bagaimana cara kerja acara di ASP.NET? Anehnya sangat sederhana. Secara singkat, tampilannya seperti ini:

    Pertama kali halaman dijalankan, ASP.NET membuat objek untuk halaman dan kontrolnya. Selanjutnya, kode inisialisasi dijalankan, setelah itu halaman diubah menjadi HTML dan dikembalikan ke klien, dan objek yang dibuat dihapus dari memori server.

    Pada titik tertentu, pengguna melakukan tindakan yang memicu postback, seperti mengklik tombol. Halaman tersebut kemudian dikirim ke server bersama dengan semua data formulir.

    ASP.NET memotong halaman yang dikembalikan ini dan membuat ulang objeknya lagi, mengembalikannya ke keadaan saat halaman ini terakhir dikirim ke klien.

    Selanjutnya, ASP.NET memeriksa operasi mana yang menyebabkan data diposting kembali dan menghasilkan peristiwa yang sesuai (misalnya, Button.Click), di mana pengembang dapat memberikan reaksi tertentu dalam kodenya.

    Sebagai aturan, pengembang lebih suka melakukan beberapa jenis operasi sisi server pada tahap ini (seperti memperbarui database atau membaca data dari file), lalu memodifikasi objek kontrol sehingga menampilkan informasi baru.

    Halaman yang dimodifikasi diubah menjadi HTML dan dikembalikan ke klien. Objek halaman dihapus dari memori. Jika terjadi postback lain, ASP.NET mengulangi langkah-langkah yang tercantum dalam paragraf 2-4.

Dengan kata lain, ASP.NET menggunakan data formulir tidak hanya untuk mengonfigurasi objek kontrol pada halaman, tetapi juga untuk memutuskan peristiwa mana yang akan dijalankan.

Misalnya, setelah mengetahui bahwa teks yang ditampilkan di bidang teks telah berubah sejak postback terakhir, ASP.NET akan memecat peristiwa yang diperlukan untuk memberi tahu halaman tentang hal ini. Untuk bereaksi terhadap acara ini atau tidak, terserah pengembang untuk memilih.

Perlu diingat bahwa karena HTTP tidak mendukung konsep status, dan semua status yang disediakan ASP.NET dipulihkan, model berbasis peristiwa pada dasarnya adalah emulasi. Untuk mendukung model ini, ASP.NET harus melakukan banyak tugas di dalamnya latar belakang. Keindahan dari konsep ini adalah bahwa programmer pemula tidak perlu terbiasa dengan semua detail sistem agar berhasil memanfaatkan acara server.

Postback data otomatis

Tentunya ada satu celah dalam sistem acara yang telah dijelaskan sejauh ini. Pengembang aplikasi Windows telah lama terbiasa berurusan dengan model peristiwa kaya yang memungkinkan kode merespons gerakan mouse, penekanan tombol keyboard, dan interaksi kontrol seketika. Namun di ASP.NET, tindakan klien terjadi di sisi klien, dan pemrosesan sisi server terjadi di server web. Ini berarti bahwa menanggapi suatu peristiwa selalu menimbulkan biaya tambahan. Oleh karena itu, peristiwa yang dipicu dengan cepat (seperti peristiwa pergerakan mouse) sama sekali tidak praktis di dunia ASP.NET.

Untuk mencapai di antarmuka pengguna efek khusus, Anda dapat membuat JavaScript sisi klien untuk menangani peristiwa cepat seperti gerakan mouse. Atau, lebih baik lagi, Anda bisa menggunakannya elemen khusus Kontrol ASP.NET dengan kemampuan bawaan semacam ini, seperti salah satu kontrol ASP.NET AJAX. Namun, kode logika bisnis hanya boleh dijalankan di lingkungan server kaya yang aman.

Jika Anda akrab dengan formulir HTML, maka Anda tahu bahwa salah satu cara yang cukup umum untuk mengirimkan halaman adalah dengan mengklik tombol Kirim. Dalam hal menggunakan kontrol server HTML standar dalam formulir web .aspx, metode ini umumnya merupakan satu-satunya opsi yang memungkinkan. Namun, setelah halaman telah diposting kembali, ASP.NET dapat langsung memecat kejadian lain (misalnya, kejadian yang memberi tahu bahwa nilai dalam kontrol input telah berubah).

Jelas, ini tidak cukup untuk membuat formulir web yang berfungsi penuh. Untungnya, kontrol web yang disediakan di ASP.NET memperluas model ini dengan postback otomatis. Dengan fasilitas ini, kontrol input dapat menghasilkan berbagai peristiwa yang dapat segera ditanggapi oleh kode server Anda.

Misalnya, Anda dapat memicu postback saat pengguna mengeklik kotak centang, mengubah pilihan dalam daftar, atau mengubah teks dalam bidang teks, lalu menavigasi ke bidang lain. Peristiwa ini tidak semodular peristiwa di aplikasi Windows, tetapi merupakan peningkatan yang signifikan dibandingkan tombol Kirim.

Apa itu postback otomatis

Untuk menggunakan postback otomatis, Anda perlu menginstal properti AutoPostBack kontrol web ke true (secara default, properti ini disetel ke false, yang memastikan performa optimal jika Anda tidak perlu merespons peristiwa perubahan apa pun). ASP.NET kemudian menggunakan sisi klien JavaScript untuk menjembatani kesenjangan antara kode klien dan server.

Secara khusus, hal berikut ini terjadi: ketika halaman web dibuat dengan satu atau lebih kontrol web yang memiliki konfigurasi AutoPostBack, ASP.NET menambahkan fungsi JavaScript ke halaman HTML yang dirender bernama ____doPostBack(). Saat dipanggil, fungsi ini memulai postback, mengirimkan halaman kembali ke server web dengan semua data formulir.

Selain itu, ASP.NET juga menambahkan dua field input tersembunyi yang digunakan fungsi ____doPostBack() untuk mengirimkan informasi tertentu kembali ke server. Informasi ini adalah ID dari kontrol yang memecat kejadian dan informasi relevan lainnya. Awalnya, data lapangan kosong, seperti yang ditunjukkan di bawah ini:

Fungsi ____doPostBack() bertanggung jawab untuk mengatur nilai-nilai ini ke informasi acara yang sesuai dan kemudian mengirimkan formulir. Di bawah ini adalah contoh fungsi ____doPostBack():

Fungsi __doPostBack(eventTarget, eventArgument) ( if (!theForm.onsubmit || (theForm.onsubmit() != false)) (theForm.__EVENTTARGET.value = eventTarget; theForm.__EVENTARGUMENT.value = eventArgument; theForm.submit(); ) )

Jangan lupa bahwa ASP.NET menghasilkan fungsi __doPostBack() secara otomatis. Kode ini diperluas karena lebih banyak kontrol AutoPostBack ditambahkan ke halaman karena data peristiwa harus disetel untuk setiap kontrol.

Terakhir, setiap kontrol yang properti AutoPostBack-nya disetel ke true dihubungkan ke fungsi __doPostBack() menggunakan atribut onclick atau onchange. Atribut ini menunjukkan tindakan apa yang harus dilakukan browser sebagai respons terhadap peristiwa klien JavaScript onclick dan onchange.

Dengan kata lain, ASP.NET secara otomatis mengonversi kejadian klien JavaScript menjadi kejadian server ASP.NET menggunakan fungsi __doPostBack() sebagai proxy. Pengembang aplikasi ASP yang berpengalaman tentu saja dapat membuat secara manual solusi serupa untuk halaman web dengan gaya ASP tradisional. Tapi ASP.NET tentu membuat hidup lebih mudah bagi pengembang dengan menangani semua detail ini secara otomatis.

Lihat Negara Bagian

Komponen terakhir dalam model ASP.NET adalah melihat mekanisme negara. Mekanisme ini memecahkan masalah lain yang muncul dari fakta bahwa HTTP tidak mendukung status - hilangnya informasi tentang perubahan.

Setiap kali halaman dikirim kembali ke server, ASP.NET menerima semua data yang telah dimasukkan pengguna di salah satu data yang ada di pegangan. kontrol . ASP.NET kemudian memuat halaman web dalam keadaan aslinya (berdasarkan skema tata letak dan pengaturan default yang ditentukan dalam file .aspx) dan mengkustomisasinya sesuai dengan data baru ini.

Masalahnya adalah bahwa dalam bentuk web dinamis, kode dapat mengubah lebih banyak detail. Misalnya, secara terprogram dapat mengubah warna judul, mengedit sepotong teks statis, menyembunyikan atau menampilkan panel dengan kontrol, atau bahkan menjepret seluruh tabel data ke kisi. Semua tindakan ini melibatkan perubahan status awal halaman. Namun, tidak satu pun dari ini tercermin dalam data formulir yang dikirimkan. Dan ini berarti setelah setiap postback data, informasi ini akan hilang.

Biasanya, kurangnya dukungan negara diatasi dengan menggunakan cookie sederhana, cookie sesi, dan solusi lainnya. Namun, semua mekanisme tersebut membutuhkan penggunaan langkah-langkah pengembangan sendiri (yang terkadang membutuhkan banyak usaha).

Untuk mengatasi keterbatasan ini, ASP.NET memiliki mekanisme serialisasi status terintegrasinya sendiri. Intinya, mekanisme ini bekerja seperti ini: setelah kode halaman selesai dijalankan (dan tepat sebelum dokumen HTML final dibuat dan dikirim ke klien), ASP.NET memeriksa properti dari semua kontrol yang ditampilkan di halaman ini. Jika salah satu dari properti ini telah berubah dari keadaan aslinya, ASP.NET membuat catatan terkait dalam koleksi nama-nilai. ASP.NET kemudian mengambil semua informasi yang dikumpulkan dan membuat serialisasi menjadi string format Base64 (yang menjamin bahwa tidak ada karakter khusus yang ilegal dalam HTML), dan kemudian memasukkan string ini ke dalam bagian tersebut. halaman sebagai bidang tersembunyi baru.

Lain kali halaman ini diposting kembali, ASP.NET melakukan hal berikut:

    Membuat ulang objek halaman dan kontrolnya berdasarkan nilai default (ditentukan dalam file .aspx), meninggalkan halaman dalam keadaan yang sama seperti saat pertama kali diminta.

    Deserialisasi informasi status dan memperbarui semua kontrol. Akibatnya, halaman kembali ke keadaan sebelum terakhir dikirim ke klien.

    Terakhir, halaman dikonfigurasi sesuai dengan data formulir yang dikirimkan. Misalnya, jika pengguna memasukkan teks baru di kotak teks atau membuat pilihan baru di kotak daftar, informasi tersebut ditempatkan di kumpulan Formulir dan digunakan oleh ASP.NET untuk membuat kontrol yang sesuai. Halaman tersebut kemudian menampilkan keadaan saat ini saat dilihat oleh pengguna.

    Sekarang kode penanganan acara Anda ikut bermain. ASP.NET menghasilkan peristiwa yang sesuai, dan kode dapat bereaksi dengan mengubah halaman, menavigasi ke lembaran baru atau dengan melakukan beberapa operasi lain.

Menggunakan status tampilan adalah solusi yang bagus karena sumber daya server dapat dibebaskan setelah setiap permintaan, memungkinkan skalabilitas hingga ratusan atau ribuan permintaan tanpa memperlambat server. Namun, Anda harus membayar semuanya. Menyimpan status tampilan di dalam halaman meningkatkan ukuran halaman. Ini memiliki efek ganda pada klien, karena tidak hanya perlu mendapatkan halaman yang lebih besar, tetapi juga perlu mengembalikan data status tampilan tersembunyi ke server pada postback berikutnya. Oleh karena itu, butuh waktu lama untuk menerima dan mengirim halaman tersebut.

Untuk halaman sederhana, overhead ini kecil, tetapi saat menyiapkan kontrol berat data yang kompleks, seperti GridView, jumlah informasi status tampilan dapat meningkat secara signifikan. Dalam kasus tersebut, Anda dapat menonaktifkan status tampilan untuk kontrol dengan menyetelnya ke Aktifkan properti ViewState untuk palsu. Namun dalam hal ini, Anda harus menginisialisasi ulang kontrol pada setiap postback.

Bahkan ketika EnableViewState disetel ke false, kontrol masih dapat menyimpan sejumlah kecil informasi status tampilan yang sangat penting untuk berfungsi dengan benar. Informasi status tampilan istimewa ini dikenal sebagai keadaan kontrol, dan Anda tidak dapat mematikannya. Namun, dalam kontrol yang dirancang dengan baik, jumlah data status kontrol jauh lebih sedikit daripada ukuran keseluruhan status tampilan.

ASP.NET menerapkan status tampilan hanya untuk properti halaman dan kontrol. ASP.NET tidak melakukan hal yang sama dengan variabel instan dan data lain yang mungkin Anda gunakan. Namun, Anda dapat memasukkan tipe data lain ke dalam status tampilan dan mengambil informasi tersebut secara manual nanti.

Gambar berikut menunjukkan mekanisme permintaan halaman pass-through yang menggabungkan semua konsep ini:

Lihat Analisis Negara

Jika Anda melihat HTML yang dihasilkan untuk halaman ASP.NET, Anda akan menemukan kolom input tersembunyi dengan informasi status tampilan:

Bilah status tampilan tidak dapat dibaca oleh manusia: hanya terlihat seperti rangkaian karakter acak. Namun, penting untuk dicatat bahwa jika diinginkan, pengguna dapat melakukan sedikit usaha dan mendekripsi dengan mudah. Berikut ini adalah cuplikan kode .NET yang melakukan ini dan menampilkan informasi yang didekodekan pada halaman web:

// viewStateString berisi informasi status tampilan. string viewStateString = Permintaan["__VIEWSTATE"]; // Mengonversi string Base64 menjadi array byte reguler // yang mewakili karakter ASCII. byte byte = Convert.FromBase64String(viewStateString); // Deserialisasi dan tampilkan string Label1.Text = System.Text.Encoding.ASCII.GetString(bytes);

Saat diterjemahkan, baris status akan terlihat seperti ini:

915261182d__ControlsRequirePostBackKey__CSVB[?S???&?7 ???

Status tampilan bukanlah tempat yang baik untuk menyimpan informasi sensitif yang tidak ingin dilihat klien, jadi data semacam ini harus ditinggalkan di server. Selain itu, Anda juga harus menghindari pengambilan keputusan berdasarkan status tampilan yang dapat membahayakan aplikasi jika klien secara sengaja atau tidak sengaja membuat perubahan apa pun pada data status tampilan.

Untungnya, keamanan data status tampilan dapat ditingkatkan. Anda dapat mengaktifkan hashing otomatis untuk mencegah upaya mengubah status tampilan, atau Anda bahkan dapat mengenkripsi status tampilan untuk mencegahnya didekripsi. Trik ini mengubah bidang tersembunyi dari solusi kasar menjadi infrastruktur yang jauh lebih andal dan dihormati.

Memisahkan Status Tampilan

Ukuran bidang status tampilan tersembunyi tidak memiliki batas. Namun, beberapa proxy, firewall, dan browser seluler tidak akan membiarkan laman masuk jika bidang tersembunyi lebih besar dari nilai tertentu. Untuk mengatasi masalah ini, Anda dapat menggunakan pemisahan status tampilan, yang secara otomatis membagi status tampilan menjadi beberapa bidang sehingga ukuran bidang tersembunyi tidak melebihi batas yang ditentukan.

Untuk ini, Anda perlu menginstal atribut maxPageStateFieldLength elemen Di file web.config. Ini menentukan ukuran maksimum melihat status dalam byte. Berikut ini adalah contoh, menentukan ukuran status tampilan 1 KB:

Perlu diingat bahwa pemisahan status tampilan hanyalah sebuah mekanisme untuk meminimalkan masalah dengan proxy tertentu (yang relatif jarang terjadi). Memisahkan status tampilan tidak meningkatkan kinerja (sebaliknya, ini menimbulkan sedikit overhead serialisasi tambahan). Untuk meningkatkan performa, Anda harus berusaha memasukkan informasi sesedikit mungkin dalam status tampilan.

Atribut UseSubmitBehavior menentukan apakah kontrol Tombol menggunakan fitur komit bawaan browser klien atau menggunakan mekanisme pemberitahuan transaksi ASP.NET.

Jika kontrol menggunakan browser untuk mengirimkan fungsinya, maka properti disetel ke TRUE. Jika tidak SALAH. Nilai defaultnya adalah BENAR.

Jika UseSubmitBehavior disetel ke FALSE, ASP.NET menambahkan skrip sisi klien untuk mengirimkan formulir. Saat ini, pengembang kontrol dapat menggunakan metode GetPostBackEventReference tombol untuk mengembalikan peristiwa postback klien. Metode GetPostBackEventReference mengembalikan string yang berisi teks panggilan fungsi klien yang dapat ditempelkan ke dalam event handler sisi klien.

tata bahasa

/>

contoh

contoh

Contoh berikut menggunakan mekanisme postback ASP.NET:


Klik tombol:
Text="Kirim" onclick="KirimBtn"
UseSubmitBehavior="FALSE" />


Pembaruan terakhir: 31.10.2015

Meskipun kita dapat menulis sendiri pembantu apa pun yang diperlukan, kerangka kerja MVC sudah menyediakan sekumpulan besar pembantu html bawaan yang memungkinkan kita menghasilkan markup ini atau itu, terutama untuk bekerja dengan formulir. Oleh karena itu, dalam banyak kasus, Anda tidak perlu membuat pembantu sendiri, dan Anda dapat menggunakan pembantu bawaan.

Pembantu Html.BeginForm

Kita dapat menggunakan elemen html standar untuk membuat formulir, misalnya:

Masukkan nama Anda

Masukkan alamat:

Ini adalah formulir html sederhana yang mengirimkan semua data yang dimasukkan saat tombol diklik. permintaan POST ke /Rumah/Beli. Pembantu BeginForm/EndForm bawaan memungkinkan Anda membuat formulir yang sama:

Masukkan nama Anda

Masukkan alamat:

}

Metode BeginForm menggunakan parameter nama metode tindakan dan nama pengontrol, serta jenis permintaan. Pembantu ini membuat sebagai tag awal

, dan tag penutup
. Oleh karena itu, saat merender tampilan ke aliran keluaran, kita akan mendapatkan kode html yang sama dengan tag formulir. Oleh karena itu, kedua metode itu identik.

Ada satu poin di sini. Jika kita memiliki dua versi dari metode yang sama yang didefinisikan di pengontrol - untuk metode POST dan GET, misalnya:

Public ActionResult Buy() ( return View(); ) public string Buy(Beli pembelian) ( .............. return "Terima kasih telah membeli buku";; )

Artinya, memanggil halaman dengan formulir dan mengirimkan formulir dilakukan dengan tindakan Beli yang sama. Dalam hal ini, dimungkinkan untuk tidak menentukan parameter dalam pembantu Html.BeginForm:

@menggunakan(Html.BeginForm()) ( ............. )

Entri informasi

Contoh sebelumnya menggunakan elemen html standar bersama dengan pembantu Html.BeginForm. Namun, set pembantu html juga berisi pembantu untuk input pengguna. MVC mendefinisikan berbagai pembantu input untuk hampir setiap elemen html. Apa yang harus dipilih - pembantu atau elemen input html standar, pengembang sendiri yang memutuskan.

Terlepas dari jenisnya, semua pembantu html dasar menggunakan setidaknya dua parameter: parameter pertama digunakan untuk menyetel nilai atribut id dan nama, dan parameter kedua digunakan untuk menyetel nilai atribut nilai

Html.TextBox

Pembantu Html.TextBox menghasilkan tag input dengan nilai atribut type dari text . Pembantu TextBox digunakan untuk menerima input pengguna. Jadi, mari kita tulis ulang form sebelumnya dengan field input diganti dengan helper Html.TextBox:

@using(Html.BeginForm("Beli", "Beranda", FormMethod.Post)) (

Masukkan nama Anda:

@Html.TextBox("Orang", "Masukkan nama")

Masukkan alamat:

@Html.TextBox("Alamat", "Masukkan alamat")

}

Kami akan mendapatkan hasil yang sama:

Html.TextArea

Pembantu TextArea digunakan untuk membuat elemen

Harap perhatikan bahwa helper menerjemahkan nilai yang ditempatkan di dalamnya, termasuk tag html (semua helper mendekode nilai model dan nilai atribut). Versi lain dari pembantu TextArea memungkinkan Anda menentukan jumlah baris dan kolom yang menentukan ukuran bidang teks.

@Html.TextArea("teks", "halo
dunia", 5, 50, nol)

Pembantu ini akan menghasilkan markup berikut:

Html.Tersembunyi

Dalam contoh formulir, kami menggunakan input bidang tersembunyi type="hidden" , alih-alih kami bisa saja menggunakan pembantu Html.Hidden. Jadi, panggilan pembantu berikut:

@Html.Hidden("BookId", "2")

menghasilkan markup:

Dan saat meneruskan variabel dari ViewBag, kita perlu mentransmisikannya ke tipe string: @Html.Hidden("BookId", @ViewBag.BookId as string)

Html.Password

Html.Password membuat bidang untuk memasukkan kata sandi. Ini mirip dengan pembantu TextBox, tetapi menampilkan topeng kata sandi alih-alih karakter yang dimasukkan. Kode selanjutnya:

@Html.Password("UserPassword", "val")

menghasilkan markup:

Html.RadioButton

Pembantu Html.RadioButton digunakan untuk membuat tombol radio. Ini menghasilkan elemen input dengan nilai type="radio" . Untuk membuat grup tombol radio, Anda perlu menetapkan nama yang sama untuk semuanya (nama properti):

@Html.RadioButton("warna", "merah") merah
@Html.RadioButton("warna", "biru") biru
@Html.RadioButton("warna", "hijau", benar) hijau

Kode ini membuat markup berikut:

merah
biru
hijau

Html.CheckBox

Html.CheckBox dapat digunakan untuk membuat dua elemen sekaligus. Ambil, misalnya, kode berikut:

@Html.CheckBox("Aktifkan", salah)

Ekspresi ini akan menghasilkan HTML berikut:

Artinya, selain kotak centang itu sendiri, bidang tersembunyi juga dibuat. Mengapa itu dibutuhkan? Intinya adalah browser mengirimkan nilai kotak centang hanya ketika kotak centang dipilih atau dicentang. Dan bidang tersembunyi memastikan bahwa elemen Aktifkan diatur ke nilai meskipun pengguna belum mencentang kotak.

Html.Label

Pembantu Html.Label membuat elemen

Elemen label mewakili label sederhana untuk melampirkan informasi ke elemen input, seperti kolom teks. Atribut for dari elemen label harus berisi ID dari elemen input terkait. Saat pengguna mengklik label, browser secara otomatis mentransfer fokus ke elemen masukan yang terkait dengan label tersebut.

Html.DropDownList

Helper Html.DropDownList membuat daftar dropdown, yaitu sebuah elemen

Sekarang berakhir contoh kompleks. Mari daftar kumpulan elemen Buku. Di pengontrol, kami akan meneruskan daftar ini melalui ViewBag:

BookContext db = BookContext baru(); Indeks ActionResult publik() ( SelectList books = new SelectList(db.Books, "Author", "Name"); ViewBag.Books = books; return View(); )

Di sini kita membuat objek SelectList dengan meneruskan konstruktornya kumpulan nilai untuk daftar (db.Books), nama properti model Buku untuk digunakan sebagai nilai (Penulis), dan nama properti model Buku untuk digunakan untuk ditampilkan dalam daftar. Dalam hal ini, tidak perlu menyetel dua properti yang berbeda, dimungkinkan menyetel satu untuk nilai dan tampilan.

Kemudian dalam tampilan kita bisa menggunakan SelectList ini seperti ini:

@Html.DropDownList("Penulis", ViewBag.Buku sebagai SelectList)

Dan saat tampilan dirender, semua item SelectList akan ditambahkan ke daftar dropdown

Html.ListBox

Pembantu Html.ListBox, seperti DropDownList , membuat sebuah elemen

Dengan mentransfer nilai tunggal ke server, semuanya menjadi jelas, tetapi bagaimana cara mentransfer banyak nilai? Katakanlah kita memiliki formulir berikut:

@using (Html.BeginForm()) ( @Html.ListBox("negara", MultiSelectList baru(string baru ( "Russia", "USA", "China", "India" )))

}

Kemudian metode pengontrol dapat menerima nilai-nilai ini seperti ini:

Indeks string publik (string negara) ( string result = ""; foreach (string c di negara) ( result += c; result += ";"; ) return "Anda telah memilih: " + result; )

Bentuk dengan banyak tombol

Biasanya, hanya ada satu tombol kirim pada formulir. Namun, dalam situasi tertentu mungkin perlu menggunakan lebih dari satu tombol. Misalnya, ada bidang untuk memasukkan nilai, dan dua tombol menunjukkan apakah nilai ini harus dihapus atau, sebaliknya, ditambahkan:

@using (Html.BeginForm("TindakanSaya", "Beranda", FormMethod.Post)) (
}

Solusi paling sederhana adalah menyetel atribut name ke nilai yang sama untuk setiap tombol, tetapi menyetel atribut value ke nilai yang berbeda. Dan metode yang berbentuk mungkin terlihat seperti ini:

Public ActionResult MyAction(string product, string action) ( if(action=="add") ( ) else if(action=="delete") ( ) // sisa kode metode )

Dan dengan bantuan konstruksi bersyarat, bergantung pada nilai parameter tindakan, yang menyimpan nilai atribut nilai dari tombol yang ditekan, tindakan tertentu dilakukan.



Memuat...
Atas