8. تطبيق [SimuPaie] – الإصدار 4 – ASP.NET / عرض متعدد / صفحة واحدة
قراءات موصى بها: المرجع [1]، تطوير الويب باستخدام ASP.NET 1.1، الأقسام:
-
مكونات الخادم ووحدات التحكم في التطبيقات
-
أمثلة على تطبيقات MVC باستخدام مكونات خادم ASP
سنقوم الآن بفحص نسخة مشتقة من تطبيق ASP.NET ثلاثي الطبقات الذي تمت مناقشته سابقًا، والتي تضيف ميزات جديدة. تتطور بنية تطبيقنا على النحو التالي:
![]() |
تتم معالجة طلب العميل على النحو التالي:
- يقوم العميل بتقديم طلب إلى التطبيق.
- يقوم التطبيق بمعالجة هذا الطلب. وللقيام بذلك، قد يحتاج إلى مساعدة من طبقة [الأعمال]، والتي قد تحتاج بدورها إلى طبقة [DAO] إذا كان من الضروري تبادل البيانات مع قاعدة البيانات. يتلقى التطبيق استجابة من طبقة [الأعمال].
- بناءً على هذا الرد، يختار (3) العرض (= الرد) لإرساله إلى العميل، ويزوده (4) بالمعلومات (النموذج) التي يحتاجها.
- يتم إرسال الرد إلى العميل (5)
هذه هي بنية ويب تُعرف باسم MVC (النموذج – العرض – وحدة التحكم):
- [التطبيق] هو وحدة التحكم. وهو يتولى معالجة جميع طلبات العميل.
- [المدخلات، المحاكاة، عمليات المحاكاة، ...] هي العروض. العرض في .NET هو كود ASP/HTML قياسي يحتوي على مكونات تحتاج إلى تهيئة. القيم التي يجب توفيرها لهذه المكونات تشكل نموذج العرض.
هنا، سنقوم بتطبيق نمط تصميم MVC على النحو التالي:
- ستكون العروض مكونات [View] داخل صفحة واحدة [Default.aspx]
- ثم يكون وحدة التحكم هي كود [Default.aspx.cs] لهذه الصفحة الواحدة.
لا يمكن إلا للتطبيقات الأساسية دعم هذا التطبيق لـ MVC. في الواقع، مع كل طلب، يتم إنشاء مثيلات لجميع مكونات الصفحة [Default.aspx]، أي جميع العروض. عند إرسال الاستجابة، يتم اختيار أحدها بواسطة كود التحكم في التطبيق ببساطة عن طريق إظهار مكون [View] المقابل وإخفاء المكونات الأخرى. إذا كان التطبيق يحتوي على العديد من العروض، فستحتوي صفحة [Default.aspx] على العديد من المكونات، وقد تصبح تكلفة إنشاء مثيلات لها باهظة. علاوة على ذلك، قد يصبح وضع [Design] للصفحة غير قابل للإدارة بسبب وجود عدد كبير جدًا من طرق العرض. هذا النوع من البنية مناسب للتطبيقات التي تحتوي على عدد قليل من طرق العرض والتي تم تطويرها بواسطة شخص واحد. عندما يمكن اعتماده، فإنه يسمح بتطوير بنية MVC بطريقة بسيطة للغاية. هذا ما سنستكشفه في هذا الإصدار الجديد.
8.1. طرق عرض التطبيق
ستكون طرق العرض المختلفة المعروضة للمستخدم كما يلي:
- عرض [VueSaisies]، الذي يعرض نموذج المحاكاة

- عرض [VueSimulation] المستخدم لعرض النتائج التفصيلية للمحاكاة:

- عرض [VueSimulations]، الذي يسرد عمليات المحاكاة التي أجراها العميل

- [EmptySimulationsView]، التي تشير إلى أن العميل ليس لديه محاكاة أو لم يعد لديه محاكاة:

- عرض [ErrorView]، الذي يشير إلى وجود خطأ واحد أو أكثر:

8.2. مشروع Visual Web Developer لطبقة [web]
مشروع Visual Web Developer لطبقة [web] هو كما يلي:
![]() |
- في [1] نجد:
- ملف تكوين التطبيق [Web.config] – مطابق لملف التطبيق السابق.
- ملف [Global.cs] الذي يتولى معالجة أحداث تطبيق الويب، وفي هذه الحالة عملية بدء تشغيله – مطابق لملف التطبيق السابق، باستثناء أنه يتولى أيضًا معالجة بدء تشغيل جلسة عمل المستخدم.
- نموذج [Default.aspx] الخاص بالتطبيق – يحتوي على طرق العرض المختلفة للتطبيق.
- في [2] توجد مراجع المشروع – وهي مطابقة لتلك الموجودة في الإصدار السابق
8.3. ملف [Global.cs]
ملف [Global.cs]، الذي يتعامل مع أحداث تطبيق الويب، مطابق لملف التطبيق السابق، باستثناء أنه يتعامل أيضًا مع بدء جلسة عمل المستخدم:
Global.cs
using System;
using System.Web;
using Pam.Dao.Entites;
using Pam.Metier.Service;
using Spring.Context.Support;
using System.Collections.Generic;
using istia.st.pam.web;
namespace pam_v4
{
public class Global : HttpApplication
{
// --- static application data ---
public static Employe[] Employes;
public static string Msg = string.Empty;
public static bool Erreur = false;
public static IPamMetier PamMetier = null;
// application startup
public void Application_Start(object sender, EventArgs e)
{
...
}
// start user session
public void Session_Start(object sender, EventArgs e)
{
// put an empty simulation list in the session
Session["simulations"] = new List<Simulation>();
}
}
}
- الأسطر 27–34: نتعامل مع بداية الجلسة. سنضع قائمة المحاكاة التي أجراها المستخدم في هذه الجلسة.
- السطر 30: يتم إنشاء قائمة فارغة بالمحاكاة. المحاكاة هي كائن من النوع [Simulation]، وسنصفه بالتفصيل بعد قليل.
- السطر 31: يتم وضع قائمة عمليات المحاكاة في الجلسة المرتبطة بمفتاح "simulations"
8.4. فئة [Simulation]
يُستخدم كائن من النوع [Simulation] لتغليف صف من جدول المحاكاة:

فيما يلي كودها:
namespace Pam.Web
{
public class Simulation
{
// simulation data
public string Nom { get; set; }
public string Prenom { get; set; }
public double HeuresTravaillees { get; set; }
public int JoursTravailles { get; set; }
public double SalaireBase { get; set; }
public double Indemnites { get; set; }
public double CotisationsSociales { get; set; }
public double SalaireNet { get; set; }
// manufacturers
public Simulation()
{
}
public Simulation(string nom, string prenom, double heuresTravailllees, int joursTravailles, double salaireBase, double indemnites, double cotisationsSociales, double salaireNet)
{
{
this.Nom = nom;
this.Prenom = prenom;
this.HeuresTravaillees = heuresTravailllees;
this.JoursTravailles = joursTravailles;
this.SalaireBase = salaireBase;
this.Indemnites = indemnites;
this.CotisationsSociales = cotisationsSociales;
this.SalaireNet = salaireNet;
}
}
}
}
تتوافق حقول الفئة مع أعمدة جدول المحاكاة.
8.5. الصفحة [Default.aspx]
8.5.1. نظرة عامة
تحتوي صفحة [Default.aspx] على عدة مكونات [View]، واحد لكل عرض. وهيكلها الأساسي كما يلي:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="pam_v4.PagePam" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Simulateur de paie</title>
</head>
<body background="ressources/standard.jpg">
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="true" />
<asp:UpdatePanel runat="server" ID="UpdatePanelPam" UpdateMode="Conditional">
<ContentTemplate>
<table>
<tr>
<td>
<h2>
Simulateur de calcul de paie</h2>
</td>
<td>
<label>
 </label>
<asp:UpdateProgress ID="UpdateProgress1" runat="server">
<ProgressTemplate>
<img src="images/indicator.gif" />
<asp:Label ID="Label5" runat="server" BackColor="#FF8000"
EnableViewState="False" Text="Calcul en cours. Patientez ....">
</asp:Label>
</ProgressTemplate>
</asp:UpdateProgress>
</td>
<td>
<asp:LinkButton ID="LinkButtonFaireSimulation" runat="server"
CausesValidation="False" OnClick="LinkButtonFaireSimulation_Click">
| Faire la simulation<br /></asp:LinkButton>
<asp:LinkButton ID="LinkButtonEffacerSimulation" runat="server"
CausesValidation="False" OnClick="LinkButtonEffacerSimulation_Click">
| Effacer la simulation<br /></asp:LinkButton>
<asp:LinkButton ID="LinkButtonVoirSimulations" runat="server"
CausesValidation="False" OnClick="LinkButtonVoirSimulations_Click">
| Voir les simulations<br /></asp:LinkButton>
<asp:LinkButton ID="LinkButtonFormulaireSimulation" runat="server"
CausesValidation="False" OnClick="LinkButtonFormulaireSimulation_Click">
| Retour au formulaire de simulation<br /></asp:LinkButton>
<asp:LinkButton ID="LinkButtonEnregistrerSimulation" runat="server"
CausesValidation="False" OnClick="LinkButtonEnregistrerSimulation_Click">
| Enregistrer la simulation<br /></asp:LinkButton>
<asp:LinkButton ID="LinkButtonTerminerSession" runat="server"
CausesValidation="False" OnClick="LinkButtonTerminerSession_Click">
| Terminer la session<br /></asp:LinkButton>
</td>
</table>
<hr />
<asp:MultiView ID="Vues1" ActiveViewIndex="0" runat="server">
<asp:View ID="VueSaisies" runat="server">
...
</asp:View>
</asp:MultiView>
<asp:MultiView ID="Vues2" runat="server">
<asp:View ID="VueSimulation" runat="server">
...
</asp:View>
<asp:View ID="VueSimulations" runat="server">
...
</asp:View>
<asp:View ID="VueSimulationsVides" runat="server">
...
</asp:View>
<asp:View ID="VueErreurs" runat="server">
...
</asp:View>
</asp:MultiView>
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
</html>
- السطر 10: العلامة الخاصة بتمكين ملحقات Ajax
- الأسطر 11–73: حاوية UpdatePanel التي يتم تحديثها بواسطة استدعاءات Ajax
- الأسطر 12–72: محتوى UpdatePanel
- الأسطر 13–52: العنوان الذي سيظهر في كل عرض. يعرض للمستخدم قائمة بالإجراءات الممكنة في شكل قائمة من الروابط.
- السطر 33: لاحظ السمة CausesValidation="False"، التي تضمن عدم تنفيذ أدوات التحقق من صحة الصفحة ضمناً عند النقر فوق الرابط. عند حذف هذه السمة، تكون قيمتها الافتراضية هي True. يمكن إجراء التحقق من صحة الصفحة بشكل صريح في كود جانب الخادم باستخدام عملية Page.Validate.
- الأسطر 53-57: مكون [MultiView] مع عرض واحد [VueSaisies]. ولهذا السبب، تم ترميز رقم العرض المراد عرضه في السطر 53: ActiveViewIndex="0"
- الأسطر 53–67: مكون [MultiView] مع أربع طرق عرض: طريقة العرض [VueSimulation] (الأسطر 59–61)، وطريقة العرض [VueSimulations] (الأسطر 62–64)، وطريقة العرض [VueSimulationsVides] (الأسطر 65–67)، وطريقة العرض [VueErreurs] (الأسطر 68–70). يعرض مكون [MultiView] عرضًا واحدًا فقط في كل مرة. لعرض العرض رقم i لمكون Vues2، اكتب الكود التالي:
8.5.2. رأس الصفحة en
يتكون العنوان من المكونات التالية:
![]() |
رقم | النوع | الاسم | الدور |
زر الارتباط | LinkButtonRunSimulation | يطلب حساب المحاكاة | |
زر الارتباط | LinkButtonClearSimulation | مسح نموذج الإدخال | |
زر الارتباط | LinkButtonViewSimulations | يعرض قائمة المحاكاة التي تم إجراؤها بالفعل | |
زر الارتباط | LinkButtonSimulationForm | العودة إلى نموذج الإدخال | |
زر الارتباط | LinkButtonSaveSimulation | يحفظ المحاكاة الحالية في قائمة المحاكاة | |
زر الارتباط | LinkButtonEndSession | ينهي الجلسة الحالية |
8.5.3. عرض [ Saisies]
مكون [View] المسمى [VueSaisies] هو كما يلي:
![]() |
رقم | النوع | الاسم | الدور |
قائمة منسدلة | EmployeeComboBox | يحتوي على قائمة بأسماء الموظفين | |
مربع النص | مربع النص Hours | عدد ساعات العمل – العدد الفعلي | |
مربع نص | TextBoxDays | عدد أيام العمل – عدد صحيح | |
RequiredFieldValidator | RequiredFieldValidatorHours | يتحقق من أن الحقل [2] [TextBoxHours] ليس فارغًا | |
مُثبت صحة التعبير العادي | RegularExpressionValidatorHours | يتحقق من أن الحقل [2] [TextBoxHours] هو عدد حقيقي >=0 | |
RequiredFieldValidator | RequiredFieldValidatorDays | يتحقق من أن الحقل [3] [TextBoxDays] ليس فارغًا | |
مُثبت صحة التعبير العادي | RegularExpressionValidatorDays | يتحقق من أن الحقل [3] [TextBoxDays] هو عدد صحيح >=0 |
8.5.4. طريقة عرض [Simulati on]
مكون [View] المسمى [SimulationView] هو كما يلي:

يتكون حصريًا من مكونات [Label] التي ترد معرفاتها أعلاه.
8.5.5. عرض [Simu lations]
مكون [View] المسمى [SimulationView] هو كما يلي:
![]() |
رقم | النوع | الاسم | الدور |
GridView | GridViewSimulations | يحتوي على قائمة المحاكاة |
تم تعريف خصائص مكون [GridViewSimulations] على النحو التالي:
![]() |
- في [1]: انقر بزر الماوس الأيمن على خيار [GridView] / [AutoFormat]
- في [2]: اختر نوع العرض لـ [GridView]
![]() |
- في [3]: حدد خصائص [GridView]
- في [4]: قم بتحرير أعمدة [GridView]
- في [5]: أضف عمود [BoundField] سيتم ربطه بإحدى الخصائص العامة للكائن المراد عرضه في صف [GridView]. سيكون الكائن المعروض هنا كائن [Simulation].
![]() |
- في [6]: أدخل عنوان العمود
- في [7]: حدد اسم خاصية فئة [Simulation] التي سيتم ربطها بهذا العمود.
- تحدد [DataFormatString] كيفية تنسيق القيم المعروضة في العمود.
تحتوي أعمدة مكون [GridViewSimulations] على الخصائص التالية:
رقم | الخصائص |
النوع: حقل مربوط، نص العنوان: الاسم، حقل البيانات: الاسم | |
النوع: حقل مرتبط، نص العنوان: الاسم الأخير، حقل البيانات: الاسم الأخير | |
النوع: حقل مرتبط، نص العنوان: ساعات العمل، حقل البيانات: HoursWorked | |
النوع: حقل مرتبط، نص العنوان: أيام العمل، حقل البيانات: DaysWorked | |
النوع: BoundField، نص العنوان: الراتب الأساسي، حقل البيانات: BaseSalary، سلسلة تنسيق البيانات: {0:C} (تنسيق العملة، C=العملة) – سيعرض رمز اليورو. | |
النوع: حقل مرتبط، نص العنوان: البدلات، حقل البيانات: Indemnites، سلسلة تنسيق البيانات: {0:C} | |
النوع: حقل مرتبط، نص العنوان: اشتراكات الضمان الاجتماعي، حقل البيانات: SocialSecurityContributions، سلسلة تنسيق البيانات: {0:C} | |
النوع: حقل مرتبط، نص العنوان: الراتب الصافي، حقل البيانات: NetSalary، سلسلة تنسيق البيانات: {0:C} |
لاحظ أن [DataField] يجب أن يتوافق مع خاصية موجودة في فئة [Simulation]. في نهاية هذه المرحلة، تم إنشاء جميع الأعمدة من النوع [BoundField]:
![]() |
- في [1]: الأعمدة التي تم إنشاؤها لـ [GridView]
- في [2]: يجب تعطيل إنشاء الأعمدة تلقائيًا عندما يقوم المطور بتعريفها يدويًا، كما فعلنا للتو.
لا يزال يتعين علينا إنشاء عمود الرابط [Remove]:

![]() |
- في [1]: أضف عمودًا من النوع [CommandField / Delete]
- في [2]: ButtonType=Link للحصول على رابط في العمود بدلاً من زر
- في [3]: CausesValidation=False؛ لن يؤدي النقر على الرابط إلى تشغيل أي عمليات تحقق من الصحة قد تكون موجودة على الصفحة. في الواقع، لا يتطلب حذف محاكاة أي تحقق من صحة البيانات.
- في [4]: سيكون رابط الحذف هو الوحيد المرئي.
- في [5]: نص هذا الرابط
8.5.6. طريقة العرض [Simulation sVides]
يحتوي مكون [View] المسمى [VueSimulationsVides] ببساطة على نص:
8.5.7. عرض [أخطاء E ]
مكون [View] المسمى [VueErreurs] هو كما يلي:
![]() |
رقم | النوع | الاسم | الدور |
المكرر | RptErrors | يعرض قائمة برسائل الخطأ |
يتيح لك مكون [Repeater] تكرار كود ASP.NET/HTML لكل كائن في مصدر البيانات، وعادةً ما يكون ذلك مجموعة. يتم تعريف هذا الكود مباشرةً في كود مصدر ASP.NET للصفحة:
<asp:Repeater ID="RptErreurs" runat="server">
<ItemTemplate>
<li>
<%# Container.DataItem %>
</li>
</ItemTemplate>
</asp:Repeater>
- السطر 2: <ItemTemplate> يحدد الكود الذي سيتم تكراره لكل عنصر في مصدر البيانات.
- السطر 4: يعرض قيمة تعبير Container.DataItem، الذي يشير إلى العنصر الحالي في مصدر البيانات. ونظرًا لأن هذا العنصر هو كائن، يتم استخدام طريقة ToString الخاصة بهذا الكائن لإدراجه في إخراج HTML للصفحة. ستكون مجموعة الكائنات لدينا عبارة عن مجموعة List(Of String) تحتوي على رسائل الخطأ. ستتضمن الأسطر 3-5 تسلسلات <li>Message</li> في إخراج HTML للصفحة.
8.6. وحدة التحكم [Default.aspx.cs]
8.6.1. نظرة عامة
لنعد إلى بنية MVC للتطبيق:
![]() |
- [Default.aspx.cs]، وهو الكود الخاص بالصفحة الواحدة [Default.aspx]، هو وحدة التحكم في التطبيق.
- [Global] هو كائن [HttpApplication] الذي يقوم بتهيئة التطبيق ويحتوي على مرجع إلى طبقة [business].
فيما يلي الهيكل الأساسي لرمز وحدة التحكم [Default.aspx.cs]:
using System.Collections.Generic;
...
public partial class PagePam : Page
{
private void setVues(bool boolVues1, bool boolVues2, int index)
{
// display the requested views
// boolVues1 : true if Vues1 multi-view is to be visible
// boolVues1 : true if the Vues2 multiview is to be visible
// index: index of the Vues2 view to be displayed
...
}
private void setMenu(bool boolFaireSimulation, bool boolEnregistrerSimulation, bool boolEffacerSimulation, bool boolFormulaireSimulation, bool boolVoirSimulations, bool boolTerminerSession)
{
// set menu options
// each Boolean is assigned to the Visible property of the corresponding link
...
}
// page loading
protected void Page_Load(object sender, System.EventArgs e)
{
// initial request processing
if (!IsPostBack)
{
...
}
}
protected void LinkButtonFaireSimulation_Click(object sender, System.EventArgs e)
{
...
}
protected void LinkButtonEffacerSimulation_Click(object sender, System.EventArgs e)
{
....
}
protected void LinkButtonVoirSimulations_Click(object sender, System.EventArgs e)
{
...
}
protected void LinkButtonEnregistrerSimulation_Click(object sender, System.EventArgs e)
{
...
}
protected void LinkButtonTerminerSession_Click(object sender, System.EventArgs e)
{
...
}
protected void LinkButtonFormulaireSimulation_Click(object sender, System.EventArgs e)
{
...
}
protected void GridViewSimulations_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
...
}
}
استجابةً لطلب المستخدم الأولي (GET)، يتم معالجة حدث Load في الأسطر 24–31 فقط. بالنسبة للطلبات اللاحقة (POST) التي تتم عبر روابط القائمة، يتم معالجة حدثين:
- حدث Load (الأسطر 24-31)، لكن الفحص المنطقي لـ Page.IsPostback (السطر 27) يضمن عدم حدوث أي شيء.
- الحدث المرتبط بالرابط الذي تم النقر عليه:
![]() |
- الأسطر 33–36: معالجة النقر على الرابط [1]
- الأسطر 38–41: معالجة النقر على الرابط [2]
- الأسطر 43-46: معالجة النقر على الرابط [3]
- الأسطر 58-61: معالجة النقر على الرابط [4]
- الأسطر 48–51: معالجة النقر على الرابط [5]
- الأسطر 53-56: معالجة النقر على الرابط [6]
لإخراج تسلسلات الكود المتكررة بشكل متكرر، تم إنشاء طريقتين داخليتين:
- setVues، الأسطر 7–14: تعيين العرض (العروض) المراد عرضها
- setMenu، الأسطر 16–21: تحدد خيارات القائمة المراد عرضها
8.6.2. حدث Load
قراءة موصى بها: المرجع [1]، تطوير الويب باستخدام ASP.NET 1.1:
- القسم الخاص بمكون [Repeater] وربط البيانات.
أول عرض يظهر للمستخدم هو النموذج الفارغ:

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

يتم التعامل مع حدث [Load] بطريقة مشابهة للإصدارات السابقة من ASP.NET:
// page loading
protected void Page_Load(object sender, System.EventArgs e)
{
// initial request processing
if (!IsPostBack)
{
// initialization errors?
if (Global.Erreur)
{
// display view [errors]
...
// menu positioning
...
return;
}
// loading employee names into the combo
...
// menu positioning
...
// view display [input]
...
}
}
السؤال: أكمل الكود أعلاه
8.6.3. الإجراء: قم بتشغيل المحاكاة
فيما يلي، الشاشة (1) هي طلب المستخدم، والشاشة (2) هي الاستجابة المرسلة إلى المستخدم من قبل تطبيق الويب. من الشاشة الرئيسية، يمكن للمستخدم بدء محاكاة:


![]() |
قد يبدو الإجراء الذي يتعامل مع هذا الإجراء كما يلي:
protected void LinkButtonFaireSimulation_Click(object sender, System.EventArgs e)
{
// wage calculation
// valid page?
Page.Validate();
if (!Page.IsValid)
{
// view display [input]
...
return;
}
// the page is validated - inputs are retrieved
double HeuresTravaillées = ...;
int JoursTravaillés = ...;
// we calculate the employee's salary
FeuilleSalaire feuillesalaire;
try
{
feuillesalaire = ...
}
catch (PamException ex)
{
// display view [errors]
...
return;
}
// put the result in the session
Session["simulation"] = ...
// displaying results
...
// display views [entry, employee, salary]
...
// menu display
...
}
السؤال: أكمل الشفرة أعلاه
8.6.4. الإجراء: حفظ المحاكاة
بمجرد اكتمال المحاكاة، يمكن للمستخدم طلب حفظها:
![]() |

قد يبدو الإجراء الذي يتعامل مع هذا الإجراء كما يلي:
protected void LinkButtonEnregistrerSimulation_Click(object sender, System.EventArgs e)
{
// save the current simulation in the list of simulations in the session
...
// the [simulations] view is displayed
...
}
السؤال: أكمل الكود أعلاه
8.6.5. الإجراء: العودة إلى نموذج المحاكاة
قراءة موصى بها: المرجع [1]، [تطوير الويب باستخدام ASP.NET 1.1]: دور الحقل المخفي _VIEWSTATE
بمجرد عرض قائمة عمليات المحاكاة، يمكن للمستخدم طلب العودة إلى نموذج المحاكاة:
![]() |
لاحظ أن الشاشة (2) تعرض النموذج كما تم إدخاله. من المهم أن نتذكر هنا أن هذه العروض المختلفة تنتمي إلى نفس الصفحة. بين الطلبات، يتم الحفاظ على قيم عناصر التحكم بواسطة آلية ViewState إذا كانت الخاصية EnableViewState لهذه العناصر مضبوطة على true.
قد يبدو الإجراء الذي يتعامل مع هذا الإجراء كما يلي:
protected void LinkButtonFormulaireSimulation_Click(object sender, System.EventArgs e)
{
// view display [input]
...
// menu positioning
...
}
السؤال: أكمل الكود أعلاه
8.6.6. الإجراء: مسح المحاكاة
بمجرد العودة إلى نموذج المحاكاة، يمكن للمستخدم طلب مسح الإدخالات الحالية:
![]() |
قد يبدو الإجراء الذي يتعامل مع هذا الإجراء كما يلي:
protected void LinkButtonEffacerSimulation_Click(object sender, System.EventArgs e)
{
// RAZ of the form
...
}
السؤال: أكمل الكود أعلاه
8.6.7. الإجراء: عرض المحاكاة
يمكن للمستخدم طلب عرض المحاكاة التي أنشأها بالفعل:
![]() |
![]() |
قد يبدو الإجراء الذي يتولى تنفيذ هذه العملية كما يلي:
protected void LinkButtonVoirSimulations_Click(object sender, System.EventArgs e)
{
// simulations are retrieved from the
...
// are there any simulations?
if (...)
{
// view [simulations] visible
...
}
else
{
// view [SimulationsVides]
...
}
// set the menu
...
}
السؤال: أكمل الكود أعلاه
8.6.8. الإجراء: حذف محاكاة
يمكن للمستخدم طلب حذف محاكاة:
![]() |
![]() |
قد يبدو الإجراء [GridViewSimulations_RowDeleting] الذي يتولى تنفيذ هذا الإجراء كما يلي:
protected void GridViewSimulations_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
// simulations are retrieved from the
...
// delete the designated simulation (e.RowIndex is the number of the deleted line)
...
// are there any simulations left?
if (...)
{
// fill in the GridView
...
}
else
{
// view [SimulationsVides]
...
}
}
السؤال: أكمل الكود أعلاه
8.6.9. الإجراء: إنهاء الجلسة
يمكن للمستخدم طلب إنهاء جلسة المحاكاة الخاصة به. يؤدي هذا إلى تجاهل محتويات الجلسة وعرض نموذج فارغ:
![]() |
![]() |
قد يبدو الإجراء الذي يتولى تنفيذ هذه العملية كما يلي:
protected void LinkButtonTerminerSession_Click(object sender, System.EventArgs e)
{
// quit session
...
// display [entries] view
...
// menu positioning
...
}
السؤال: أكمل الكود أعلاه
تمرين عملي: قم بتنفيذ تطبيق الويب السابق على جهازك. أضف وظائف Ajax إليه.






















