لا ترحم تقدم آسيا والمحيط الهادئ. إعادة النشر التلقائي للبيانات

استمارة

عائلة استمارةيسترجع قيم عناصر النموذج المرسلة في نص طلب HTTP باستخدام نموذج يستخدم طريقة POST.

بناء الجملة

نموذج طلب(عنصر) [(فِهرِس) |.عدد]

خيارات

عنصر

اسم عنصر النموذج الذي تسترد منه العائلة القيم.

فِهرِس

معلمة اختيارية تسمح بالوصول إلى واحدة من عدة قيم للمعلمات. يمكن أن يكون أي عدد صحيح بين -1 و نموذج طلب(معامل).عدد.

ملحوظات

عائلة استمارةمفهرسة بأسماء المعلمات في نص الطلب. معنى نموذج طلب(عنصر) هي مصفوفة من جميع القيم عنصر،التي تظهر في نص الطلب. يمكنك تحديد عدد قيم المعلمات عن طريق الاتصال نموذج طلب(عنصر).عدد. إذا لم يكن للمعلمة قيم متعددة مرتبطة بها ، يكون العداد هو 1. إذا لم يتم العثور على المعلمة ، يكون العداد 0.

للإشارة إلى قيمة واحدة لعنصر نموذج لها قيم متعددة ، يجب عليك تحديد قيمة لـ فِهرِس. معامل فِهرِسيمكن أن يكون أي رقم بين 1 و 1 نموذج طلب(عنصر).عدد. إذا تمت الإشارة إلى أحد معلمات النموذج بدون قيمة فِهرِس، يتم إرجاع البيانات كسلسلة مفصولة بفواصل.

متى نموذج طلبباستخدام المعلمات ، يوزع خادم الويب جسم طلب HTTP ويعيد البيانات المحددة. إذا كان التطبيق الخاص بك يتطلب بيانات غير محللة من نموذج ، فيمكنك الوصول إليه عن طريق الاتصال نموذج طلببدون معلمات.

ملحوظة. عند العمل مع ASP وإرسال كميات كبيرة من البيانات تتجاوز 100 كيلو بايت ، الطريقة نموذج طلبلا يمكن استخدامه. إذا احتاج تطبيقك إلى إرسال بيانات تتجاوز هذا الحد ، فيمكنك إنشاء وحدة برامج تستخدم الامتداد طلب BinaryRead.

من الممكن تكرار جميع قيم البيانات في طلب نموذج. على سبيل المثال ، إذا قام المستخدم بملء نموذج عن طريق توفير قيمتين ، شوكولاتة و باترسكوتش ، لعنصر فافوريتفلافور ، يمكنك استخراج هذه القيم باستخدام البرنامج النصي أدناه.

بالنسبة إلى i = 1 للطلب. النموذج ("النكهة المفضلة")

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

سيعرض البرنامج النصي أعلاه المعلومات التالية.

يمكنك استخدام هذه التقنية لعرض اسم المعلمة ، كما هو موضح في البرنامج النصي أدناه.

بالنسبة إلى i = 1 إلى Request.Form ("FavouriteFlavor"). count٪>

Request.Form (FavouriteFlavor) =<%= Request.Form("FavoriteFlavor")(i)_
%>

سيعرض هذا البرنامج النصي ما يلي في المستعرض:

Request.Form (FavouriteFlavor) = شوكولاتة

Request.Form (FavouriteFlavor) = باترسكوتش

مثال

ضع في اعتبارك الشكل التالي:

اسمك الاول:

ما هي نكهة الآيس كريم المفضلة لديك:

يمكن تمرير نص الطلب التالي من هذا النموذج:

الاسم الأول = جيمس والنكهة = روكي + الطريق

يمكن بعد ذلك استخدام البرنامج النصي أدناه:

مرحباً،<%= Request.Form("firstname") %>.

النكهة المفضلة لديك<%= Request.Form("flavor") %>.

ستبدو النتيجة كما يلي:

مرحبًا يا جيمس. نكهتك المفضلة هي Rocky Road.

إذا كنت تستخدم البرنامج النصي أدناه:

بيانات النموذج التي لم يتم تحليلها هي:<%= Request.Form %>

ستبدو النتيجة كما يلي:

بيانات النموذج التي لم يتم تحليلها هي: firstname = James & flavour = Rocky + Road

ملحوظة.إذا كان النموذج يتضمن كائنات متعددة بنفس الاسم (مثل علامات HTML SELECT) ، فسيكون العنصر في عائلة النموذج عبارة عن قائمة مفصولة بفواصل لجميع القيم المحددة.

منطقة التطبيق

أنظر أيضا

شهادة العميل _شهادة العميل ، بسكويت _Cookies_Request ، سلسلة الاستعلام _QueryString ، متغيرات الخادم _ServerVariables

نموذج ASP.NET

نماذج HTML

أولئك الذين هم على دراية بلغة HTML يعرفون ذلك أكثر من غيرهم بطريقة بسيطةإرسال بيانات العميل إلى الخادم هو استخدام المقبض . داخل المقبض يمكن وضع الواصفات تمثيل الآخرين العناصر الأساسيةواجهة المستخدم مثل الأزرار وحقول النص ومربعات القوائم وأزرار الاختيار.

على سبيل المثال ، يوجد أدناه صفحة HTML بها نموذج يحتوي على حقلين نصيين ومربعي اختيار وزر إرسال ، أي خمسة واصفات فقط :

استطلاع

أدخل أسمك:
إدخال اسم آخر:

على ماذا البرمجة؟
سي #
VB.NET



يوضح الشكل كيف ستبدو هذه الصفحة البسيطة في نافذة متصفح الويب:

عندما ينقر المستخدم فوق الزر "إرسال" ، يقوم المستعرض باسترداد القيم الحالية لكل عنصر تحكم ويشكل سلسلة طويلة منها. ثم يتم إرسال هذه السلسلة إلى الصفحة المحددة في المقبض

(في هذه الحالة page.aspx) باستخدام عملية HTTP POST. في هذا المثال ، يعني هذا أن خادم الويب يمكنه تلقي طلب مع سطر المعلومات التالي:

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

عند إنشاء هذه السلسلة ، يتبع المتصفح قواعد معينة. يتم دائمًا إرسال المعلومات كتسلسل من أزواج الاسم / القيمة مفصولة بعلامة العطف (&). داخل الزوج ، يتم فصل الاسم عن القيمة بعلامة يساوي (=). يتم تجاهل مربعات الاختيار حتى يتم تحديدها ، وفي هذه الحالة يقوم المتصفح بتمرير النص كقيمة. معلومات كاملةحول نموذج HTML القياسي المدعوم في كل متصفح حالي يمكن العثور عليه في W3C - Forms.

تقريبًا تضيف جميع أطر البرمجة من جانب الخادم طبقة من التجريد إلى بيانات النموذج الأولية. إنهم يكسرون هذا الصف ويقدمونه بطريقة أكثر فائدة. على سبيل المثال ، تسمح لك JSP و ASP و ASP.NET باسترداد قيمة عنصر تحكم النموذج باستخدام طبقة الكائن الرفيعة. في ASP و ASP.NET ، يمكن البحث عن القيم بالاسم بتنسيق طلب تشكيل مجموعات. إذا قمنا بتحويل الصفحة السابقة إلى نموذج ويب ASP.NET ، فيمكن تطبيق هذا الأسلوب برمز مثل هذا:

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

هذه "الطبقة" الرفيعة الموجودة أعلى رسالة POST مفيدة ، لكنها لا تزال بعيدة عن البنية الحقيقية الموجهة للكائنات. لهذا السبب يأخذ ASP.NET خطوة أخرى إلى الأمام. عند نشر الصفحة مرة أخرى إلى بيئة ASP.NET ، تقوم باسترداد القيم ، وتعبئة مجموعة النموذج (للتوافق مع الإصدارات السابقة مع التعليمات البرمجية لـ ASP) ، ثم تكوين كائنات التحكم المناسبة. هذا يعني أنه يمكن استخدام بناء الجملة التالي الأكثر أهمية لاسترداد المعلومات من نموذج ويب ASP.NET:

String firstName = txtFirstName.Text ؛

هذا الرمز له أيضًا ميزة أمان النوع. بمعنى آخر ، عندما تسترد حالة مربع الاختيار ، ستحصل على قيمة منطقية صحيحة أو خاطئة بدلاً من الكلمة في. نتيجة لذلك ، يتم عزل المطورين عن الميزات الفردية لبناء جملة HTML.

في ASP.NET ، يتم وضع كافة عناصر التحكم في مقبض منفصل. . يتم تمييز هذا المقبض بالسمة runat = "server" ، والتي تسمح بتشغيله على الخادم. لا يسمح ASP.NET بإنشاء نماذج ويب تحتوي على أكثر من معالج خادم ، على الرغم من أنه من الممكن إنشاء صفحات ترسل معلومات إلى صفحات أخرى باستخدام تقنية الإرسال عبر الصفحات.

واجهة مستخدم ديناميكية

مما لا شك فيه أن نموذج التحكم يسهل استخراج المعلومات حول النموذج. والأهم من ذلك ، أنه يجعل الحياة أسهل عندما تحتاج إلى إضافة معلومات إلى صفحة. يمكن قراءة جميع خصائص التحكم في الويب وتعيينها تقريبًا. هذا يعني أنه ، على سبيل المثال ، يمكن تعيين خاصية Text لحقل النص بنفس سهولة قراءته.

على سبيل المثال ، ضع في اعتبارك ما يحدث إذا كنت على وشك تحديث جزء من النص على صفحة ويب ليعكس بعض المعلومات التي أدخلها المستخدم مسبقًا. في ASP الكلاسيكي ، تحتاج إلى العثور على مكان مناسب لإدراج كتلة البرنامج النصي الذي يكتب تعليمات HTML البرمجية. فيما يلي مقتطف رمز ASP.NET يستخدم هذه التقنية لعرض رسالة ترحيب ذات ألوان زاهية:

رسالة سلسلة = " مرحبًا "+ txtFirstName.Text +" "+ txtLastName.Text +""؛ Response.Write (رسالة) ؛

من ناحية أخرى ، يتم تبسيط الموقف عند تحديد عنصر تحكم التسمية (التسمية) في ASP.NET:

الآن يمكنك فقط تعيين خصائصه:

Label1.Text = "مرحبًا" + txtFirstName.Text + "" + txtLastName.Text؛ Label1.ForeColor = Color.Red ،

هذا الرمز له العديد من المزايا. أولاً ، الكتابة أسهل بكثير (وبدون أخطاء). في هذا المثال ، المدخرات لا تكاد تذكر ، لكنها تصبح مهمة جدًا إذا أخذنا في الاعتبار صفحة كاملةيحتاج ASP.NET إلى تعديل كتل HTML المعقدة التي تحتوي على ارتباطات وصور وأنماط ديناميكيًا.

ثانيًا ، من الأسهل أيضًا وضع التعليمات البرمجية القائمة على التحكم داخل الصفحة. يمكنك كتابة التعليمات البرمجية لـ ASP.NET بغض النظر عن مكان حدوث الإجراء المقابل. من ناحية أخرى ، في حالة ASP الكلاسيكية ، سيتعين عليك الاهتمام بتخطيط المحتوى على الصفحة والموضع المناسب لكود كتلة البرنامج النصي. إذا كانت الصفحة تحتوي على مناطق ديناميكية ، فيمكن أن تصبح فوضى من كتل البرامج النصية غير ذات الصلة وغير مرتبة.

ميزة أخرى (أقل وضوحًا ، لكنها أكثر أهمية) لنموذج التحكم هي الطريقة التي يتم بها إخفاء تفاصيل HTML ذات المستوى المنخفض. هذا لا يجعل من الممكن كتابة التعليمات البرمجية دون تعلم جميع تفاصيل HTML فحسب ، بل يسمح أيضًا للصفحات بدعم نطاق أوسع من المتصفحات. نظرًا لأن عنصر التحكم يعرض نفسه ، فإنه لديه القدرة على تخصيص مخرجاته لدعم متصفحات مختلفة ، أو ميزات متقدمة من جانب العميل ، أو حتى معايير أخرى متعلقة بـ HTML مثل XHTML أو WML. على هذا النحو ، لم يعد الرمز مرتبطًا مباشرة بمعيار HTML.

نموذج حدث ASP.NET

تستخدم تقنية ASP الكلاسيكية نموذج خطييعالج. هذا يعني أن كود الصفحة تتم معالجته من البداية إلى النهاية ويتم تنفيذه بالترتيب. بسبب هذا النموذج ، يتعين على المطورين الذين يستخدمون تقنية ASP الكلاسيكية كتابة قدر مناسب من التعليمات البرمجية حتى للصفحات البسيطة.

مثال نموذجي على ذلك هو صفحة الويب التي تحتوي على ثلاثة أزرار إرسال مختلفة لثلاث عمليات مختلفة. في مثل هذه الحالة ، يجب أن تميز شفرة البرنامج النصي بوضوح الزر الذي تم النقر عليه عند إرسال الصفحة ، ثم تحديد وتنفيذ الإجراء المناسب بناءً على المنطق الشرطي.

يجعل ASP.NET الأمور أسهل من خلال تقديمه نموذج معالجة يحركها الحدث. في هذا النموذج ، يضيف المطور أولاً عناصر تحكم إلى نموذج الويب ثم يقرر الأحداث التي يريدون الاستجابة لها. كل معالج حدث هو طريقة منفصلة ، مما يجعل كود الصفحة يبدو أنيقًا ومنظمًا.

هذا النموذج ليس جديدًا ، ولكن قبل ظهور ASP.NET ، تم استخدامه حصريًا في مجال برمجة واجهات المستخدم ذات الإطارات لتطبيقات العميل الغني. كيف تعمل الأحداث في ASP.NET؟ والمثير للدهشة بسيط للغاية. باختصار ، يبدو كالتالي:

    في المرة الأولى التي يتم فيها تشغيل الصفحة ، يقوم ASP.NET بإنشاء كائنات للصفحة وعناصر التحكم الخاصة بها. بعد ذلك ، يتم تنفيذ كود التهيئة ، وبعد ذلك يتم تحويل الصفحة إلى HTML وإعادتها إلى العميل ، وتتم إزالة الكائنات التي تم إنشاؤها من ذاكرة الخادم.

    في مرحلة ما ، ينفذ المستخدم إجراءً يؤدي إلى إعادة النشر ، مثل النقر على زر. ثم يتم إرسال الصفحة إلى الخادم مع جميع بيانات النموذج.

    يعترض ASP.NET هذه الصفحة التي تم إرجاعها ويعيد إنشاء كائناتها مرة أخرى ، ويعيدها إلى الحالة التي كانت عليها عندما تم إرسال هذه الصفحة إلى العميل آخر مرة.

    بعد ذلك ، يتحقق ASP.NET من العملية التي تسببت في إعادة إرسال البيانات وإنشاء الأحداث المناسبة (على سبيل المثال ، Button.Click) ، والتي يمكن للمطور توفير رد فعل معين في التعليمات البرمجية الخاصة به.

    كقاعدة عامة ، يفضل المطورون إجراء نوع من العمليات من جانب الخادم في هذه المرحلة (مثل تحديث قاعدة بيانات أو قراءة البيانات من ملف) ، ثم تعديل كائنات التحكم بحيث تعرض المعلومات الجديدة.

    يتم تحويل الصفحة المعدلة إلى HTML وإعادتها إلى العميل. تتم إزالة كائنات الصفحة من الذاكرة. في حالة حدوث إعادة نشر أخرى ، يكرر ASP.NET الخطوات المذكورة في الفقرات 2-4.

بمعنى آخر ، يستخدم ASP.NET بيانات النموذج ليس فقط لتكوين كائنات التحكم على الصفحة ، ولكن أيضًا لتحديد الأحداث التي سيتم إطلاقها.

على سبيل المثال ، عند ملاحظة أن النص المعروض في حقل نص قد تغير منذ آخر إعادة نشر ، سيقوم ASP.NET بإطلاق الحدث الضروري لإعلام الصفحة بذلك. للرد على هذا الحدث أم لا ، الأمر متروك للمطور للاختيار.

ضع في اعتبارك أنه نظرًا لأن HTTP لا يدعم مفهوم الحالات ، ويتم استعادة جميع الحالات التي يوفرها ASP.NET ، فإن النموذج المستند إلى الحدث هو في الأساس محاكاة. من أجل دعم هذا النموذج ، يجب على ASP.NET تنفيذ العديد من المهام بتنسيق خلفية. يكمن جمال هذا المفهوم في أن المبرمج المبتدئ لا يحتاج إلى أن يكون على دراية بجميع تفاصيل النظام من أجل الاستفادة بنجاح من أحداث الخادم.

إعادة النشر التلقائي للبيانات

بالطبع ، هناك فجوة واحدة في نظام الأحداث تم وصفها حتى الآن. لطالما اعتاد مطورو تطبيقات Windows على التعامل مع نموذج حدث غني يسمح للكود بالاستجابة لحركات الماوس ، وضربات مفاتيح لوحة المفاتيح ، وتفاعلات التحكم اللحظية. ولكن في ASP.NET ، يحدث إجراء العميل من جانب العميل ، وتحدث المعالجة من جانب الخادم على خادم الويب. هذا يعني أن الاستجابة لحدث ما تحمل دائمًا بعض النفقات العامة. لذلك ، تعتبر الأحداث التي تم إطلاقها بسرعة (مثل أحداث تحريك الماوس) غير عملية تمامًا في عالم ASP.NET.

لتحقيق في واجهة المستخدمتأثير معين ، يمكنك إنشاء JavaScript من جانب العميل للتعامل مع الأحداث السريعة مثل حركات الماوس. أو حتى أفضل من ذلك ، يمكنك استخدام عنصر خاصيتحكم ASP.NET بإمكانيات مضمنة من هذا النوع ، مثل أحد عناصر تحكم ASP.NET AJAX. ومع ذلك ، يجب تشغيل كود منطق الأعمال فقط في بيئة خادم غنية وآمنة.

إذا كنت معتادًا على نماذج HTML، فأنت تعلم أن إحدى الطرق الشائعة إلى حد ما لإرسال صفحة هي النقر فوق الزر "إرسال". في حالة استخدام عناصر تحكم خادم HTML القياسية في نماذج الويب .aspx ، تكون هذه الطريقة هي الخيار الوحيد الممكن عمومًا. ومع ذلك ، بعد إعادة نشر الصفحة بالفعل ، يمكن لـ ASP.NET إطلاق أحداث أخرى على الفور (على سبيل المثال ، الأحداث التي تُعلم بتغيير قيمة في عنصر تحكم الإدخال).

من الواضح أن هذا لا يكفي لإنشاء نموذج ويب كامل الوظائف. لحسن الحظ ، تعمل عناصر تحكم الويب المتوفرة في ASP.NET على توسيع هذا النموذج بإعادة النشر التلقائي. باستخدام هذا المرفق ، يمكن لعناصر التحكم في الإدخال إنشاء أحداث متنوعة يمكن أن يستجيب لها رمز الخادم على الفور.

على سبيل المثال ، يمكنك تشغيل إعادة النشر عندما ينقر المستخدم على مربع اختيار ، أو يغير تحديدًا في قائمة ، أو يغير النص في حقل نصي ثم ينتقل إلى حقل آخر. هذه الأحداث ليست معيارية مثل الأحداث في تطبيق Windows ، لكنها تحسن كبير على زر إرسال.

ما هو إعادة النشر التلقائي

لاستخدام إعادة النشر التلقائي ، تحتاج إلى التثبيت خاصية AutoPostBackالتحكم في الويب إلى true (افتراضيًا ، يتم تعيين هذه الخاصية على false ، مما يضمن الأداء الأمثل في الحالات التي لا تحتاج فيها إلى الاستجابة لأي أحداث تغيير). ثم يستخدم ASP.NET جانب عميل JavaScript لسد الفجوة بين رمز العميل والخادم.

على وجه الخصوص ، يحدث ما يلي: عند إنشاء صفحة ويب باستخدام عنصر تحكم ويب واحد أو أكثر تم تكوين AutoPostBack ، يضيف ASP.NET وظيفة JavaScript إلى صفحة HTML المقدمة المسماة ____ doPostBack (). عند الاستدعاء ، تبدأ هذه الوظيفة في إعادة النشر ، وإرسال الصفحة مرة أخرى إلى خادم الويب مع جميع بيانات النموذج.

بالإضافة إلى ذلك ، يضيف ASP.NET أيضًا حقلي إدخال مخفيين تستخدمهما دالة ____ doPostBack () لإرسال معلومات معينة مرة أخرى إلى الخادم. هذه المعلومات هي معرّف عنصر التحكم الذي أطلق الحدث والمعلومات الأخرى ذات الصلة. في البداية ، بيانات الحقل فارغة ، كما هو موضح أدناه:

وظيفة ____ doPostBack () هي المسؤولة عن تعيين هذه القيم إلى معلومات الحدث المناسبة ثم إرسال النموذج. فيما يلي مثال على وظيفة ____ doPostBack ():

الوظيفة __doPostBack (eventTarget، eventArgument) (if (! theForm.onsubmit || (theForm.onsubmit ()! = false)) (theForm .__ EVENTTARGET.value = eventTarget؛ theForm .__ EVENTARGUMENT.value = eventArgument؛ theFormit.s ))

لا تنس أن ASP.NET تنشئ وظيفة __doPostBack () تلقائيًا. يتم توسيع هذا الرمز كلما تمت إضافة المزيد من عناصر التحكم في AutoPostBack إلى الصفحة لأنه يجب تعيين بيانات الحدث لكل عنصر تحكم.

أخيرًا ، يتم توصيل أي عنصر تحكم تم تعيين خاصية AutoPostBack الخاصة به على صحيح بوظيفة __doPostBack () باستخدام سمة onclick أو onchange. تشير هذه السمات إلى الإجراء الذي يجب أن يتخذه المتصفح استجابةً لأحداث عميل JavaScript عند النقر وتغيير.

بمعنى آخر ، يحول ASP.NET تلقائيًا حدث عميل JavaScript إلى حدث خادم ASP.NET باستخدام وظيفة __doPostBack () كوكيل. يمكن لمطور تطبيقات ASP ذو الخبرة ، بالطبع ، إنشاء ملفات حل مماثللصفحات الويب بأسلوب ASP التقليدي. لكن ASP.NET بالتأكيد يجعل الحياة أسهل كثيرًا للمطور من خلال التعامل مع كل هذه التفاصيل تلقائيًا.

حالة العرض

آخر مكون في نموذج ASP.NET هو عرض آلية الدولة. تحل هذه الآلية مشكلة أخرى تنشأ من حقيقة أن HTTP لا يدعم الحالة - فقدان المعلومات حول التغييرات.

في كل مرة يتم فيها إرسال صفحة إلى الخادم ، يتلقى ASP.NET كافة البيانات التي أدخلها المستخدم في أي من البيانات الموجودة في المؤشر. ضوابط . يقوم ASP.NET بعد ذلك بتحميل صفحة الويب في حالتها الأصلية (بناءً على نظام التخطيط والإعدادات الافتراضية التي تم تحديدها في ملف .aspx) وتخصيصها وفقًا لهذه البيانات الجديدة.

تكمن المشكلة في أنه في نموذج ويب ديناميكي ، يمكن للكود أن يغير الكثير من التفاصيل. على سبيل المثال ، يمكنه تغيير لون العنوان برمجيًا ، أو تحرير جزء من نص ثابت ، أو إخفاء أو إظهار لوحة مع عناصر تحكم ، أو حتى محاذاة جدول بيانات كامل إلى شبكة. تتضمن كل هذه الإجراءات تغيير الحالة الأولية للصفحة. ومع ذلك ، لا تنعكس أي من هذه في بيانات النموذج المقدمة. وهذا يعني أنه بعد كل إعادة نشر للبيانات ، ستفقد هذه المعلومات.

عادة ، يتم التغلب على نقص الدعم الحكومي باستخدام ملفات تعريف الارتباط البسيطة وملفات تعريف الارتباط للجلسة والحلول الأخرى. ومع ذلك ، تتطلب جميع هذه الآليات استخدام تدابير التنمية الذاتية (التي تتطلب في بعض الأحيان الكثير من الجهد).

لمعالجة هذا القيد ، يحتوي ASP.NET على آلية تسلسل الحالة المتكاملة الخاصة به. في جوهرها ، تعمل هذه الآلية على النحو التالي: بعد انتهاء تنفيذ كود الصفحة (وقبل إنشاء مستند HTML النهائي وإرساله إلى العميل مباشرةً) ، يفحص ASP.NET خصائص جميع عناصر التحكم المعروضة في هذه الصفحة. إذا تم تغيير أي من هذه الخصائص عن حالتها الأصلية ، فإن ASP.NET يقوم بعمل ملاحظة مقابلة في مجموعة الاسم والقيمة. بعد ذلك ، يأخذ ASP.NET جميع المعلومات التي تم جمعها ويقوم بتسلسلها في سلسلة تنسيق Base64 (مما يضمن عدم وجود أحرف خاصة غير قانونية في HTML) ، ثم يقوم بإدراج هذه السلسلة في القسم صفحات كحقل مخفي جديد.

في المرة التالية التي يتم فيها إعادة نشر هذه الصفحة ، يقوم ASP.NET بما يلي:

    يعيد إنشاء كائن الصفحة وعناصر التحكم الخاصة به بناءً على القيم الافتراضية (المحددة في ملف .aspx) ، تاركًا الصفحة في نفس الحالة التي كانت عليها عند طلبها لأول مرة.

    يقوم بإلغاء تسلسل معلومات الحالة وتحديث كافة عناصر التحكم. نتيجة لذلك ، تعود الصفحة إلى الحالة التي كانت عليها قبل إرسالها إلى العميل آخر مرة.

    أخيرًا ، يتم تكوين الصفحة وفقًا لبيانات النموذج المقدمة. على سبيل المثال ، إذا أدخل المستخدم نصًا جديدًا في مربع نص أو قام بتحديد جديد في مربع قائمة ، يتم وضع هذه المعلومات في مجموعة النموذج واستخدامها بواسطة ASP.NET لإنشاء عناصر التحكم المناسبة. ثم تعرض الصفحة الحالة الحالية عندما يشاهدها المستخدم.

    الآن يأتي دور رمز التعامل مع الحدث الخاص بك. ينشئ ASP.NET الأحداث المناسبة ، ويمكن أن تتفاعل التعليمات البرمجية عن طريق تغيير الصفحة ، والانتقال إلى صفحة جديدةأو عن طريق إجراء بعض العمليات الأخرى.

يعد استخدام حالة العرض حلاً رائعًا لأنه يمكن تحرير موارد الخادم بعد كل طلب ، مما يسمح بقابلية التوسع لمئات أو آلاف الطلبات دون إبطاء الخادم. ومع ذلك ، عليك أن تدفع مقابل كل شيء. يؤدي تخزين حالة العرض داخل الصفحة إلى زيادة حجم الصفحة. هذا له تأثير مزدوج على العميل ، حيث لا يحتاج فقط إلى الحصول على صفحة أكبر ، ولكنه يحتاج أيضًا إلى إعادة بيانات حالة العرض المخفية إلى الخادم في إعادة النشر التالية. لذلك ، يستغرق استلام الصفحة وإرسالها وقتًا طويلاً.

بالنسبة للصفحات البسيطة ، يكون هذا الحمل صغيرًا ، ولكن عند إعداد عناصر تحكم معقدة كثيفة البيانات ، مثل GridView ، يمكن أن يزيد مقدار معلومات حالة العرض بشكل كبير. في مثل هذه الحالات ، يمكنك تعطيل حالة العرض لعنصر التحكم عن طريق تعيينه على خاصية EnableViewStateعلى خطأ. ولكن في هذه الحالة ، سيتعين عليك إعادة تهيئة عنصر التحكم في كل إعادة نشر.

حتى عند تعيين EnableViewState على false ، لا يزال بإمكان عنصر التحكم الاحتفاظ بكمية صغيرة من معلومات حالة العرض التي تعتبر بالغة الأهمية لعملها بشكل صحيح. تُعرف معلومات حالة العرض المميزة هذه باسم دولة السيطرة، ولا يمكنك إيقاف تشغيله. ومع ذلك ، في عنصر تحكم جيد التصميم ، يكون مقدار بيانات حالة التحكم أقل بكثير من حجم حالة العرض بالكامل.

يطبق ASP.NET حالة العرض فقط على خصائص الصفحة والتحكم. ASP.NET لا تفعل الشيء نفسه مع متغيرات المثيل والبيانات الأخرى التي قد تستخدمها. ومع ذلك ، يمكنك وضع أنواع أخرى من البيانات في حالة العرض واسترداد هذه المعلومات يدويًا لاحقًا.

يوضح الشكل التالي آلية طلب صفحة المرور التي تجمع كل هذه المفاهيم:

عرض تحليل الحالة

إذا قمت بعرض HTML الذي تم إنشاؤه لصفحة ASP.NET ، فستجد حقل إدخال مخفي يحتوي على معلومات حالة العرض:

شريط حالة العرض ليس قابلاً للقراءة من قبل الإنسان: إنه يبدو فقط كسلسلة من الأحرف العشوائية. ومع ذلك ، من المهم ملاحظة أنه إذا رغبت في ذلك ، يمكن للمستخدم بذل القليل من الجهد وفك تشفيره بسهولة تامة. ما يلي هو مقتطف رمز .NET الذي يقوم بذلك ويعرض المعلومات التي تم فك ترميزها على صفحة ويب:

يحتوي // viewStateString على معلومات حالة العرض. string viewStateString = طلب ["__ VIEWSTATE"] ؛ // تحويل سلسلة Base64 إلى مصفوفة عادية من البايت // تمثل أحرف ASCII. بايت بايت = Convert.FromBase64String (viewStateString) ؛ // قم بإلغاء تسلسل وعرض السلسلة Label1.Text = System.Text.Encoding.ASCII.GetString (bytes) ؛

عند فك التشفير ، سيبدو سطر الحالة كما يلي:

915261182d__ControlsRequirePostBackKey__CSVB [؟ S ؟؟؟ &؟ 7 ؟؟؟

حالة العرض ليست مكانًا جيدًا لتخزين المعلومات الحساسة التي لا يرغب العميل في رؤيتها ، لذلك يجب ترك هذا النوع من البيانات على الخادم. بالإضافة إلى ذلك ، يجب أيضًا تجنب اتخاذ القرارات بناءً على حالة العرض التي قد تعرض التطبيق للخطر إذا قام العميل عن قصد أو عن طريق الخطأ بإجراء أي تغييرات على بيانات حالة العرض.

لحسن الحظ ، من الممكن زيادة أمان بيانات حالة العرض. يمكنك تمكين التجزئة التلقائية لمنع محاولات تغيير حالة العرض ، أو يمكنك حتى تشفير حالة العرض لمنع فك تشفيرها. تحول هذه الحيل الحقول المخفية من حل بديل أولي إلى جزء من البنية التحتية أكثر موثوقية وتبجيلًا.

تقسيم عرض الحالة

حجم حقل حالة العرض المخفي ليس له حدود. ومع ذلك ، فإن بعض الوكلاء والجدران النارية ومتصفحات الجوال لن تسمح للصفحات بالمرور إذا كانت الحقول المخفية أكبر من قيمة معينة. لحل هذه المشكلة ، يمكنك استخدام تقسيم حالة العرض ، والذي يقسم تلقائيًا حالة العرض إلى حقول متعددة بحيث لا تتجاوز أحجام الحقول المخفية الحد المحدد.

لهذا تحتاج إلى التثبيت سمة maxPageStateFieldLengthعنصر في ملف web.config. هذا يحدد أكبر مقاسعرض الحالة بالبايت. فيما يلي مثال ، لتحديد حجم حالة عرض بحجم 1 كيلوبايت:

ضع في اعتبارك أن تقسيم حالة العرض هو مجرد آلية لتقليل المشكلات مع بعض الوكلاء (وهو أمر نادر الحدوث نسبيًا). لا يؤدي تقسيم حالة العرض إلى تحسين الأداء (على العكس من ذلك ، فإنه يقدم مقدارًا إضافيًا صغيرًا من التسلسل الإضافي). لتحسين الأداء ، يجب أن تسعى جاهدة لتضمين أقل قدر ممكن من المعلومات في حالة العرض.

تحدد السمة UseSubmitBehavior ما إذا كان عنصر تحكم الزر يستخدم ميزة الالتزام المضمنة في مستعرض العميل أو يستخدم آلية إعلام المعاملات ASP.NET.

إذا كان عنصر التحكم يستخدم مستعرضًا لإرسال وظائفه ، فسيتم تعيين الخاصية على TRUE. خلاف ذلك خطأ. القيمة الافتراضية هي الحقيقية.

إذا تم تعيين UseSubmitBehavior إلى FALSE ، فإن ASP.NET يضيف برنامجًا نصيًا من جانب العميل لإرسال النموذج. حاليًا ، يمكن لمطوري عناصر التحكم استخدام أسلوب GetPostBackEventReference الخاص بالزر لإرجاع حدث إعادة النشر للعميل. إرجاع الأسلوب GetPostBackEventReference سلسلة تحتوي على نص مكالمات دالة العميل التي يمكن لصقها في معالج حدث من جانب العميل.

قواعد

/>

أمثلة

أمثلة

يستخدم المثال التالي آلية إعادة النشر لـ ASP.NET:


انقر فوق الزر:
Text = "Submit" onclick = "SubmitBtn"
UseSubmitBehavior = "FALSE" />


آخر تحديث: 31.10.2015

على الرغم من أنه يمكننا كتابة أي مساعد مطلوب بأنفسنا ، فإن إطار عمل MVC يوفر بالفعل مجموعة كبيرة من مساعدي html المدمجين الذين يسمحون لنا بإنشاء هذا الترميز أو ذاك ، بشكل أساسي للعمل مع النماذج. لذلك ، في معظم الحالات ، لن تضطر إلى إنشاء مساعدين خاصين بك ، ويمكنك استخدام المساعدين المدمجين.

Html.BeginForm المساعد

يمكننا استخدام عناصر html القياسية لإنشاء نماذج ، على سبيل المثال:

أدخل أسمك

أدخل العنوان:

هذا نموذج html بسيط يرسل جميع البيانات المدخلة عند النقر على الزر. طلب POSTإلى / الصفحة الرئيسية / شراء. يسمح لك مساعد BeginForm / EndForm المدمج بإنشاء نفس النموذج:

أدخل أسمك

أدخل العنوان:

}

تأخذ طريقة BeginForm كمعلمات اسم طريقة الإجراء واسم وحدة التحكم ، بالإضافة إلى نوع الطلب. يتم إنشاء هذا المساعد كعلامة بداية

وعلامة الإغلاق
. لذلك ، عند تقديم العرض إلى تدفق الإخراج ، سنحصل على نفس كود html كما هو الحال مع علامة النموذج. لذلك ، كلا الطريقتين متطابقتان.

هناك نقطة واحدة هنا. إذا كان لدينا إصداران من نفس الطريقة المحددة في وحدة التحكم - لطريقتي POST و GET ، على سبيل المثال:

Public ActionResult Buy () (Return View () ؛) سلسلة عامة Buy (Buy Buy) (.............. قم بإرجاع "شكرًا لك على شراء الكتاب" ؛؛)

وهذا يعني ، في الواقع ، أن استدعاء الصفحة مع النموذج وإرسال النموذج يتم تنفيذه من خلال إجراء الشراء نفسه. في هذه الحالة ، من الممكن عدم تحديد معلمات في مساعد Html.BeginForm:

@ using (Html.BeginForm ()) (.............)

إدخال المعلومات

استخدم المثال السابق عناصر html قياسية مع مساعد Html.BeginForm. ومع ذلك ، تحتوي مجموعة مساعد html أيضًا على مساعدين لإدخال المستخدم. يحدد MVC نطاقًا واسعًا من مساعدي الإدخال لكل عنصر html تقريبًا. ماذا تختار - مساعد أو عناصر إدخال HTML قياسية ، يقرر المطور نفسه.

بغض النظر عن النوع ، يستخدم جميع مساعدي html الأساسيين معلمتين على الأقل: يتم استخدام المعلمة الأولى لتعيين قيم سمات المعرف والاسم ، ويتم استخدام المعلمة الثانية لتعيين قيمة سمة القيمة

Html

ينشئ مساعد Html.TextBox علامة إدخال مع قيمة سمة النوع للنص. يتم استخدام مساعد TextBox لتلقي مدخلات المستخدم. لذلك ، دعنا نعيد كتابة النموذج السابق مع استبدال حقول الإدخال بـ Html.TextBox المساعد:

@ using (Html.BeginForm ("Buy"، "Home"، FormMethod.Post)) (

أدخل أسمك:

@ Html.TextBox ("الشخص"، "أدخل الاسم")

أدخل العنوان:

@ Html.TextBox ("العنوان"، "أدخل عنوانًا")

}

سوف نحصل على نفس النتيجة:

Html. منطقة نصية

يتم استخدام مساعد TextArea لإنشاء عنصر

يرجى ملاحظة أن المساعد يفك تشفير القيمة الموضوعة فيه ، بما في ذلك علامات html (جميع المساعدين يفك تشفير قيم النموذج وقيم السمات). تسمح لك الإصدارات الأخرى من مساعد TextArea بتحديد عدد الصفوف والأعمدة التي تحدد حجم حقل النص.

@ Html.TextArea ("text"، "مرحبًا
العالم "، 5 ، 50 ، خالية)

سيُنشئ هذا المساعد الترميز التالي:

Html. مخفي

في مثال النموذج ، استخدمنا نوع إدخال الحقل المخفي = "hidden" ، بدلاً من استخدام مساعد Html.Hidden بدلاً من ذلك. إذن ، اتصال المساعد التالي:

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

إنشاء الترميز:

وعند تمرير متغير من ViewBag ، نحتاج إلى تحويله إلى نوع السلسلة: @ Html.Hidden ("BookId"، @ ViewBag.BookId كسلسلة)

أتش تي أم أل

يقوم Html.Password بإنشاء حقل لإدخال كلمة المرور. إنه مشابه لمساعد TextBox ، لكنه يعرض قناع كلمة المرور بدلاً من الأحرف التي تم إدخالها. الكود التالي:

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

يولد الترميز:

Html.RadioButton

يتم استخدام مساعد Html.RadioButton لإنشاء أزرار اختيار. يقوم بإنشاء عنصر إدخال مع نوع القيمة = "راديو". لإنشاء مجموعة من أزرار الاختيار ، تحتاج إلى تعيين نفس الاسم لكل منهم (خاصية الاسم):

@ Html.RadioButton ("color"، "red") أحمر
@ Html.RadioButton ("color"، "blue") أزرق
@ Html.RadioButton ("color"، "green"، true) أخضر

ينشئ هذا الرمز الترميز التالي:

أحمر
أزرق
أخضر

Html.CheckBox

يمكن استخدام Html.CheckBox لإنشاء عنصرين في وقت واحد. خذ ، على سبيل المثال ، الكود التالي:

@ Html.CheckBox ("تمكين" ، خطأ)

سيُنشئ هذا التعبير HTML التالي:

أي ، بالإضافة إلى مربع الاختيار نفسه ، يتم أيضًا إنشاء حقل مخفي. لماذا هو مطلوب؟ النقطة المهمة هي أن المتصفح يرسل قيمة مربع الاختيار فقط عند تحديد خانة الاختيار أو تحديدها. ويضمن الحقل المخفي تعيين عنصر التمكين على قيمة حتى إذا لم يقم المستخدم بتحديد المربع.

أتش تي أم أل

ينشئ مساعد Html.Label عنصرًا

يمثل عنصر التسمية تسمية بسيطة لإرفاق المعلومات بعناصر الإدخال ، مثل الحقول النصية. يجب أن تحتوي السمة لـ لعنصر التسمية على معرف عنصر الإدخال المرتبط. عندما ينقر المستخدم على ملصق ، ينقل المتصفح تلقائيًا التركيز إلى عنصر الإدخال المرتبط بهذا التصنيف.

Html.DropDownList

ينشئ مساعد Html.DropDownList قائمة منسدلة ، أي عنصر

الآن انتهت مثال معقد. دعنا نسرد مجموعة من عناصر الكتاب. في وحدة التحكم ، سنقوم بتمرير هذه القائمة من خلال ViewBag:

BookContext db = new BookContext ()؛ Public ActionResult Index () (SelectList books = new SelectList (db.Books، "Author"، "Name")؛ ViewBag.Books = books؛ return View ()؛)

هنا نقوم بإنشاء كائن SelectList عن طريق تمرير مجموعة القيم للقائمة (db.Books) في مُنشئها ، واسم خاصية نموذج الكتاب لاستخدامها كقيمة (المؤلف) ، واسم خاصية نموذج الكتاب لاستخدامها في العرض في القائمة. في هذه الحالة ، ليس من الضروري تعيين خاصيتين مختلفتين ، كان من الممكن تعيين واحدة لكل من القيمة والعرض.

ثم في طريقة العرض يمكننا استخدام قائمة التحديد هذه على النحو التالي:

@ Html.DropDownList ("المؤلف" ، ViewBag.Books as SelectList)

وعندما يتم تقديم العرض ، ستتم إضافة جميع عناصر SelectList إلى القائمة المنسدلة

Html.ListBox

يقوم مساعد Html.ListBox ، مثل DropDownList ، بإنشاء عنصر

مع نقل القيم الفردية إلى الخادم ، كل شيء واضح ، ولكن كيف يمكن نقل قيم متعددة؟ لنفترض أن لدينا النموذج التالي:

@ using (Html.BeginForm ()) (@ Html.ListBox ("countries"، new MultiSelectList (سلسلة جديدة ("Russia"، "USA"، "China"، "India")))

}

ثم يمكن أن تتلقى طريقة وحدة التحكم هذه القيم كما يلي:

فهرس السلسلة العامة (سلسلة البلدان) (نتيجة السلسلة = "" ؛ foreach (سلسلة c في البلدان) (نتيجة + = c ؛ نتيجة + = "؛" ؛) إرجاع "لقد اخترت:" + نتيجة ؛)

شكل بأزرار متعددة

عادةً ما يكون هناك زر إرسال واحد فقط في النموذج. ومع ذلك ، في بعض المواقف قد يكون من الضروري استخدام أكثر من زر. على سبيل المثال ، يوجد حقل لإدخال قيمة ، ويشير زران إلى ما إذا كان يجب حذف هذه القيمة أو ، على العكس من ذلك ، إضافتها:

@ using (Html.BeginForm ("MyAction"، "Home"، FormMethod.Post)) (
}

أبسط حل هو تعيين سمة الاسم على نفس القيمة لكل زر ، ولكن قم بتعيين سمة القيمة على قيمة مختلفة. والطريقة التي تأخذ الشكل قد تبدو كالتالي:

Public ActionResult MyAction (سلسلة منتج ، إجراء سلسلة) (if (action == "add") () else if (action == "delete") () // rest of method code)

وبمساعدة البناء الشرطي ، اعتمادًا على قيمة معلمة الإجراء ، التي تخزن قيمة سمة القيمة للزر المضغوط ، يتم تنفيذ إجراءات معينة.



تحميل...
قمة