Saya mencoba untuk membangun sebuah "mikro-webapp" yang sangat, sangat sederhana yang saya curigai akan menarik bagi beberapa Stack Overflow jika saya bisa menyelesaikannya. Saya menghostingnya di situs C # in Depth saya, yaitu vanilla ASP.NET 3.5 (bukan MVC).
Alurnya sangat sederhana:
- Jika pengguna memasuki aplikasi dengan URL yang tidak menentukan semua parameter (atau jika ada yang tidak valid) saya hanya ingin menampilkan kontrol masukan pengguna. (Hanya ada dua.)
- Jika pengguna memasukkan app dengan URL yang tidak memiliki semua parameter yang diperlukan, saya ingin menampilkan hasil dan kontrol input (sehingga mereka dapat mengubah parameter)
Berikut adalah persyaratan yang saya tetapkan sendiri (campuran desain dan implementasi):
- Saya ingin kiriman menggunakan GET daripada POST, sebagian besar agar pengguna dapat menandai halaman dengan mudah.
- Saya tidak ingin URL-nya terlihat konyol setelah dikirimkan, dengan potongan dan potongan yang tidak relevan. Tolong hanya URL utama dan parameter aslinya.
- Idealnya saya sama sekali tidak ingin meminta JavaScript. Tidak ada alasan bagus untuk itu di aplikasi ini.
- Saya ingin dapat mengakses kontrol selama waktu render dan mengatur nilai, dll. Secara khusus, saya ingin dapat mengatur nilai default kontrol ke nilai parameter yang diteruskan, jika ASP.NET tidak dapat melakukan ini secara otomatis untuk saya (dalam batasan lain).
- Saya senang bisa melakukan sendiri semua validasi parameter, dan saya tidak membutuhkan banyak hal terkait peristiwa sisi server. Sangat mudah untuk mengatur semuanya pada pemuatan halaman daripada melampirkan acara ke tombol dll.
Sebagian besar tidak apa-apa, tetapi saya belum menemukan cara apa pun untuk sepenuhnya menghapus kondisi tampilan dan menjaga fungsionalitas berguna lainnya. Dengan menggunakan postingan dari postingan blog ini, saya berhasil menghindari mendapatkan nilai aktual apa pun untuk kondisi tampilan - tetapi itu masih berakhir sebagai parameter pada URL, yang terlihat sangat jelek.
Jika saya membuatnya menjadi bentuk HTML biasa daripada bentuk ASP.NET (yaitu mengambil runat="server"
) maka saya tidak mendapatkan kondisi tampilan ajaib - tetapi kemudian saya tidak dapat mengakses kontrol secara terprogram.
Saya bisa melakukan semua ini dengan mengabaikan sebagian besar ASP.NET dan membangun dokumen XML dengan LINQ ke XML, dan menerapkannya IHttpHandler
. Itu terasa level yang agak rendah.
Saya menyadari bahwa masalah saya dapat diselesaikan dengan merilekskan kendala saya (misalnya menggunakan POST dan tidak peduli dengan parameter surplus) atau dengan menggunakan ASP.NET MVC, tetapi apakah persyaratan saya benar-benar tidak masuk akal?
Mungkin ASP.NET tidak menurunkan skala ke aplikasi semacam ini? Namun ada alternatif yang sangat mungkin: Saya hanya bersikap bodoh, dan ada cara yang sangat sederhana untuk melakukannya yang belum saya temukan.
Ada pemikiran, siapa? (Isyarat komentar tentang bagaimana yang perkasa jatuh, dll. Tidak apa-apa - Saya harap saya tidak pernah mengklaim sebagai pakar ASP.NET, karena kenyataannya justru sebaliknya ...)
Jawaban:
Solusi ini akan memberi Anda akses terprogram ke kontrol secara keseluruhan termasuk semua atribut di kontrol. Selain itu, hanya nilai kotak teks yang akan muncul di URL setelah pengiriman sehingga URL permintaan GET Anda akan lebih "bermakna"
Kemudian di belakang kode Anda, Anda dapat melakukan semua yang Anda butuhkan di PageLoad
Jika Anda tidak menginginkan formulir yang memiliki
runat="server"
, maka Anda harus menggunakan kontrol HTML. Lebih mudah untuk bekerja dengan tujuan Anda. Cukup gunakan tag HTML biasa dan letakkanrunat="server"
dan beri mereka ID. Kemudian Anda dapat mengaksesnya secara terprogram dan kode tanpaViewState
.Satu-satunya downside adalah bahwa Anda tidak akan memiliki akses ke banyak kontrol server ASP.NET yang "membantu" seperti
GridView
s. Saya menyertakan aRepeater
dalam contoh saya karena saya berasumsi bahwa Anda ingin memiliki bidang pada halaman yang sama dengan hasil dan (sepengetahuan saya) aRepeater
adalah satu-satunya kontrol DataBound yang akan berjalan tanparunat="server"
atribut di tag Formulir.sumber
Anda pasti (IMHO) di jalur yang benar dengan tidak menggunakan runat = "server" di tag FORM Anda. Ini hanya berarti Anda harus mengekstrak nilai dari Request.QueryString secara langsung, seperti dalam contoh ini:
Di halaman .aspx itu sendiri:
dan di belakang kode:
Triknya di sini adalah kita menggunakan ASP.NET Literals di dalam atribut value = "" dari input teks, sehingga kotak teks itu sendiri tidak harus runat = "server". Hasilnya kemudian dibungkus di dalam ASP: Panel, dan properti Terlihat diatur pada pemuatan halaman tergantung apakah Anda ingin menampilkan hasil apa pun atau tidak.
sumber
Oke Jon, masalah viewstate dulu:
Saya belum memeriksa apakah ada jenis perubahan kode internal sejak 2.0 tetapi inilah cara saya menangani penghapusan kondisi tampilan beberapa tahun yang lalu. Sebenarnya bidang tersembunyi itu di-hardcode di dalam HtmlForm sehingga Anda harus mendapatkan yang baru dan melangkah ke renderingnya untuk membuat panggilan sendiri. Perhatikan bahwa Anda juga dapat membiarkan __eventtarget dan __eventtarget tidak aktif jika Anda tetap menggunakan kontrol input lama biasa (yang menurut saya Anda ingin karena itu juga membantu tidak memerlukan JS pada klien):
Jadi Anda mendapatkan 3 MethodInfo statis itu dan memanggil mereka melewatkan bagian kondisi tampilan itu;)
dan inilah konstruktor tipe formulir Anda:
Jika saya menjawab pertanyaan Anda dengan benar, Anda juga ingin tidak menggunakan POST sebagai tindakan formulir Anda, jadi inilah cara melakukannya:
Saya kira ini cukup banyak. Beri tahu saya bagaimana kelanjutannya.
EDIT: Saya lupa metode kondisi tampilan Halaman:
Jadi, Formulir kustom Anda: HtmlForm mendapatkan abstrak baru (atau bukan) Halaman: System.Web.UI.Page: P
Dalam hal ini saya menutup metode karena Anda tidak dapat menyegel Halaman (meskipun tidak abstrak Scott Guthrie akan membungkusnya menjadi satu lagi: P) tetapi Anda dapat menyegel Formulir Anda.
sumber
Pernahkah Anda berpikir untuk tidak menghapus POST melainkan mengarahkan ke url GET yang sesuai saat formulir di-POST. Artinya, terima GET dan POST, tetapi pada POST buat permintaan GET dan alihkan ke sana. Ini dapat ditangani baik di halaman atau melalui HttpModule jika Anda ingin membuatnya tidak tergantung halaman. Saya pikir ini akan membuat segalanya lebih mudah.
EDIT: Saya berasumsi bahwa Anda telah menetapkan EnableViewState = "false" pada halaman.
sumber
Saya akan membuat modul HTTP yang menangani perutean (mirip dengan MVC tetapi tidak canggih, hanya beberapa
if
pernyataan) dan menyerahkannya ke halamanaspx
atauashx
.aspx
lebih disukai karena lebih mudah untuk mengubah template halaman. Saya tidak akan menggunakanWebControls
dalamaspx
namun. CumaResponse.Write
.Untuk menyederhanakan, Anda dapat melakukan validasi parameter dalam modul (karena modul tersebut mungkin berbagi kode dengan perutean) dan menyimpannya ke
HttpContext.Items
dan kemudian merendernya di halaman. Ini akan bekerja hampir seperti MVC tanpa semua bel dan peluit. Inilah yang sering saya lakukan sebelum hari ASP.NET MVC.sumber
Saya sangat senang untuk benar-benar meninggalkan kelas halaman sama sekali dan hanya menangani setiap permintaan dengan kasus saklar besar berdasarkan url. Setiap "halaman" menjadi template html dan objek ac #. Kelas template menggunakan regex dengan delegasi pencocokan yang dibandingkan dengan kumpulan kunci.
manfaat:
gelandangan:
Jon, apa yang kita lakukan SO pada Sabtu pagi :)?
sumber
Saya pikir asp: Kontrol repeater sudah usang.
Mesin template ASP.NET bagus tetapi Anda dapat dengan mudah menyelesaikan pengulangan dengan for loop ...
Formulir ASP.NET tidak apa-apa, ada dukungan yang layak dari Visual Studio tetapi hal runat = "server" ini, itu salah. ViewState hingga.
Saya sarankan Anda melihat apa yang membuat ASP.NET MVC begitu hebat, siapa yang menjauh dari pendekatan Formulir ASP.NET tanpa membuang semuanya.
Anda bahkan dapat menulis barang penyedia build Anda sendiri untuk menyusun tampilan kustom seperti NHaml. Saya pikir Anda harus melihat di sini untuk kontrol lebih lanjut dan hanya mengandalkan runtime ASP.NET untuk membungkus HTTP dan sebagai lingkungan hosting CLR. Jika Anda menjalankan mode terintegrasi maka Anda juga dapat memanipulasi permintaan / respons HTTP.
sumber