Minggu lalu saya menulis artikel "Di mana nilai properti kontrol ViewState disimpan?" Ini menjelaskan bahwa Control.ViewState pada akhirnya diakses melalui dua metode Control.SaveViewState dan Control.LoadViewState. Ada kalimat di artikel yang mungkin membuat Anda bingung: "Saat kita menggunakan this.ViewState[key] untuk membaca dan menulis setelah OnInit, properti ini benar", di mana "properti ini" mengacu pada StateItem.IsDirty. Mengapa properti IsDirty selalu benar setelah OnInit? Setelah mengacu pada SANGAT Memahami ViewState, saya akhirnya mengerti bahwa itu tidak selalu benar. Mohon dengarkan saya jelaskan alasan detailnya.
Hal pertama yang perlu Anda perhatikan adalah metode StateBag.TrackViewState. Metode ini akan dipanggil ketika kontrol OnInit. Fungsinya adalah membiarkan StateBag mulai melacak perubahan di StateItem . Artinya, sebelum OnInit, properti IsDirty adalah salah, dan tidak peduli bagaimana Anda menetapkan nilai properti Value, properti IsDirty tidak akan diubah. Setelah OnInit, properti IsDirty juga tetap salah hingga Anda mengubah nilai properti Value untuk pertama kalinya (mengacu pada perubahan melalui metode this.ViewState[key]). Pada tahap SaveViewState, hanya StateItems yang atribut IsDirtynya benar yang akan disimpan.
Mengapa dirancang seperti ini? Misalnya, properti Teks Label yang ditentukan secara deklaratif diberi nilai awal di ASPX, dan kemudian nilai awal secara alami dipertahankan melalui ViewState["Text"]. Pada siklus hidup halaman berikutnya, pertama-tama properti Teks dari Label ini akan memuat nilai awal yang ditentukan secara deklaratif dalam ASPX selama OnInit, lalu menimpanya dengan ViewState["Text"] yang dibaca dari ViewState selama LoadViewState. Namun, kecuali Anda mengubah properti Text secara terprogram di siklus hidup halaman sebelumnya, ViewState["Text"] masih merupakan nilai awal, jadi Anda menggunakan ViewState["Text"] untuk menyimpan nilai awal untuk menimpa nilai awal yang ditentukan secara deklaratif. sama sekali tidak ada gunanya menimpa nilai yang sama dengan cara ini, dan juga membuang-buang ruang ViewState. Untuk mengatasi masalah pemborosan sumber daya ini, nilai apa pun yang belum diubah setelah definisi deklaratif tidak boleh dipertahankan menggunakan ViewState, dan implementasi detailnya adalah mekanisme TrackViewState yang disebutkan di atas.
Omong-omong, Control.ViewState telah dijelaskan. Jika Anda seorang desainer kontrol, Anda dapat menyimpan properti kontrol dengan aman di ViewState dengan cara berikut:
Teks string publik
{
dapatkan {kembalikan ini.ViewState["Teks"] sebagai string;}
setel {ini.ViewState["Teks"] = nilai;}
}
Mekanisme internalnya akan mengetahui cara membedakan apakah nilai yang Anda simpan adalah nilai awal yang ditentukan secara deklaratif di ASPX, dan kemudian memutuskan apakah akan mempertahankan nilai tersebut. Pada saat yang sama, jika Anda ingin mengubah penentuan apakah nilai ViewState tetap ada pada tahap apa pun, Anda dapat mengubahnya melalui ViewState.SetItemDirty(key, dirty), yang pada dasarnya memenuhi kebutuhan semua pengembang kontrol.
http://www.cnblogs.com/cathsfz/archive/2006/10/29/543695.html