สัปดาห์ที่แล้วฉันเขียนบทความ "ค่าของคุณสมบัติการควบคุม ViewState ที่บันทึกไว้อยู่ที่ไหน" โดยอธิบายว่าในที่สุด Control.ViewState ก็เข้าถึงได้ผ่านสองวิธี Control.SaveViewState และ Control.LoadViewState มีประโยคหนึ่งในบทความที่อาจทำให้คุณสับสน: "เมื่อเราใช้ this.ViewState[key] เพื่ออ่านและเขียนหลังจาก OnInit คุณสมบัตินี้จะเป็นจริง" โดยที่ "คุณสมบัตินี้" อ้างถึง StateItem.IsDirty เหตุใดคุณสมบัติ IsDirty จึงเป็นจริงเสมอหลังจาก OnInit หลังจากอ้างถึง TRULY เข้าใจ ViewState แล้ว ในที่สุดฉันก็เข้าใจว่ามันไม่จริงเสมอไป โปรดฟังฉันอธิบายเหตุผลโดยละเอียด
สิ่งแรกที่คุณต้องดูคือเมธอด StateBag.TrackViewState เมธอดนี้จะถูกเรียกเมื่อตัวควบคุม OnInit หน้าที่ของมันคือให้ StateBag เริ่มติดตามการเปลี่ยนแปลงใน StateItem การเปลี่ยนแปลงใด ๆ จะทำให้คุณสมบัติ IsDirty ของ StateItem เป็นจริง . นั่นคือ ก่อน OnInit คุณสมบัติ IsDirty จะเป็นเท็จ และไม่ว่าคุณจะตั้งค่าของคุณสมบัติ Value อย่างไร คุณสมบัติ IsDirty จะไม่เปลี่ยนแปลง หลังจาก OnInit คุณสมบัติ IsDirty ยังคงเป็นเท็จจนกว่าคุณจะเปลี่ยนค่าของคุณสมบัติ Value เป็นครั้งแรก (อ้างอิงถึงการเปลี่ยนแปลงผ่านเมธอด this.ViewState[key]) ในขั้นตอน SaveViewState เฉพาะ StateItems ที่มีแอตทริบิวต์ IsDirty เป็นจริงเท่านั้นที่จะถูกบันทึก
เหตุใดจึงได้รับการออกแบบเช่นนี้? ตัวอย่างเช่น คุณสมบัติข้อความของป้ายกำกับที่กำหนดไว้อย่างชัดเจนจะได้รับการกำหนดค่าเริ่มต้นใน ASPX จากนั้นค่าเริ่มต้นจะคงอยู่ตามธรรมชาติผ่าน ViewState["Text"] ในวงจรชีวิตของหน้าถัดไป ขั้นแรกคุณสมบัติข้อความของป้ายกำกับนี้จะโหลดค่าเริ่มต้นที่กำหนดไว้อย่างชัดเจนใน ASPX ระหว่าง OnInit จากนั้นจึงเขียนทับด้วย ViewState["Text"] ที่อ่านจาก ViewState ระหว่าง LoadViewState อย่างไรก็ตาม เว้นแต่คุณจะเปลี่ยนคุณสมบัติข้อความโดยทางโปรแกรมในวงจรการใช้งานหน้าก่อนหน้า ViewState["Text"] ยังคงเป็นค่าเริ่มต้น ดังนั้นคุณจึงใช้ ViewState["Text"] เพื่อบันทึกค่าเริ่มต้นเพื่อเขียนทับค่าเริ่มต้นที่กำหนดไว้อย่างเปิดเผย การเขียนทับค่าเดียวกันด้วยวิธีนี้ไม่มีความหมายเลย และยังเปลืองพื้นที่ ViewState ด้วย เพื่อแก้ไขปัญหาการสิ้นเปลืองทรัพยากรนี้ ค่าใดๆ ที่ไม่มีการเปลี่ยนแปลงหลังจากคำจำกัดความที่ประกาศไม่ควรคงอยู่โดยใช้ ViewState และการใช้งานโดยละเอียดคือกลไก TrackViewState ที่กล่าวถึงข้างต้น
พูดถึงเรื่องนี้แล้ว Control.ViewState ได้รับการอธิบายไว้แล้ว หากคุณเป็นผู้ออกแบบการควบคุม คุณสามารถจัดเก็บคุณสมบัติการควบคุมใน ViewState ได้อย่างปลอดภัยด้วยวิธีต่อไปนี้:
ข้อความสตริงสาธารณะ
-
รับ {return this.ViewState["Text"] เป็นสตริง;}
ตั้งค่า {this.ViewState["ข้อความ"] = ค่า;}
-
กลไกภายในจะรู้วิธีแยกแยะว่าค่าที่คุณบันทึกเป็นค่าเริ่มต้นที่กำหนดไว้อย่างชัดเจนบน ASPX หรือไม่ จากนั้นจึงตัดสินใจว่าจะคงค่านั้นไว้หรือไม่ ในเวลาเดียวกัน หากคุณต้องการเปลี่ยนการพิจารณาว่าค่า ViewState ยังคงอยู่ที่ขั้นตอนใดๆ หรือไม่ คุณสามารถเปลี่ยนได้ผ่าน ViewState.SetItemDirty(key, dirt) ซึ่งโดยพื้นฐานแล้วตรงกับความต้องการของนักพัฒนาส่วนควบคุมทั้งหมด
http://www.cnblogs.com/cathsfz/archive/2006/10/29/543695.html