كتبت في الأسبوع الماضي مقالًا "أين يتم حفظ قيمة خاصية التحكم ViewState؟" وأوضح أنه يتم الوصول إلى Control.ViewState في النهاية من خلال الطريقتين Control.SaveViewState وControl.LoadViewState. هناك جملة في المقالة قد تجعلك في حيرة من أمرك: "عندما نستخدم this.ViewState[key] للقراءة والكتابة بعد OnInit، تكون هذه الخاصية صحيحة"، حيث تشير "هذه الخاصية" إلى StateItem.IsDirty. لماذا تكون الخاصية IsDirty صحيحة دائمًا بعد OnInit؟ بعد الإشارة إلى فهم ViewState حقًا، فهمت أخيرًا أنه ليس صحيحًا دائمًا، يرجى الاستماع إلي وأنا أشرح الأسباب التفصيلية.
أول شيء تحتاج إلى إلقاء نظرة عليه هو أسلوب StateBag.TrackViewState. سيتم استدعاء هذه الطريقة عندما يكون عنصر التحكم OnInit هو السماح لـ StateBag ببدء تعقب التغييرات في StateItem . أي أنه قبل OnInit، كانت الخاصية IsDirty خاطئة، وبغض النظر عن كيفية تعيين قيمة الخاصية Value، فلن تتغير الخاصية IsDirty. بعد OnInit، تظل الخاصية IsDirty أيضًا خاطئة حتى تقوم بتغيير قيمة خاصية القيمة لأول مرة (بالإشارة إلى التغيير من خلال الأسلوب this.ViewState[key]). في مرحلة SaveViewState، سيتم حفظ عناصر الحالة التي تكون سمة 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["Text"] = القيمة؛}
}
ستعرف آليته الداخلية كيفية التمييز بين ما إذا كانت القيمة التي تحفظها هي القيمة الأولية المحددة بشكل صريح على ASPX، ثم تقرر ما إذا كانت القيمة ستستمر أم لا. في الوقت نفسه، إذا كنت تريد تغيير تحديد ما إذا كانت قيمة ViewState ثابتة في أي مرحلة، فيمكنك تغييرها من خلال ViewState.SetItemDirty(key, dirty)، والتي تلبي بشكل أساسي احتياجات جميع مطوري التحكم.
http://www.cnblogs.com/cathsfz/archive/2006/10/29/543695.html