8. اپلیکیشن [SimuPaie] – نسخهٔ ۴ – ASP.NET / چندنمایی / تکصفحهای
مطالعهٔ پیشنهادی: مرجع [1]، توسعهٔ WEB با ASP.NET 1.1، بخشها:
-
اجزای سرور و کنترلکنندهٔ برنامه
-
نمونههایی از برنامههای MVC که از اجزای سرور ASP استفاده میکنند
ما اکنون در حال بررسی گونهای از برنامه سهلایه ASP.NET مورد بحث قبلی هستیم که قابلیتهای جدیدی را اضافه میکند. معماری برنامه ما به شرح زیر تکامل مییابد:
![]() |
پردازش درخواست مشتری در مراحل زیر انجام میشود:
- کلاینت درخواستی را به برنامه ارسال میکند.
- برنامه این درخواست را پردازش میکند. برای این کار، ممکن است به کمک لایه [métier] نیاز داشته باشد که آن نیز در صورت نیاز به تبادل داده با پایگاه داده، ممکن است به لایه [dao] نیاز پیدا کند. برنامه کاربردی پاسخی را از لایه [métier] دریافت میکند.
- بر اساس این، نما (= پاسخ) را برای ارسال به کلاینت انتخاب میکند (۳) و اطلاعات (قالب) مورد نیاز آن را در اختیارش قرار میدهد (۴).
- پاسخ به کلاینت ارسال میشود (۵)
این یک معماری وب است که به عنوان MVC (مدل–نما–کنترلکننده) شناخته میشود:
- [Application] کنترلکننده است. این همه درخواستهای کلاینت را مدیریت میکند.
- [Saisies, Simulation, Simulations, ...] نماها هستند. یک نما در .NET کدی استاندارد ASP / HTML است که شامل کامپوننتهایی است که باید مقداردهی اولیه شوند. مقادیمی که باید به این کامپوننتها ارائه شوند، مدل نما را تشکیل میدهند.
در اینجا، الگوی طراحی MVC را به شرح زیر پیادهسازی خواهیم کرد:
- ویوها کامپوننتهای [View] در یک صفحه واحد [Default.aspx] خواهند بود
- بنابراین کنترلر، کد [Default.aspx.cs] برای این صفحهٔ واحد است.
فقط برنامههای پایه میتوانند از این پیادهسازی MVC پشتیبانی کنند. این به این دلیل است که با هر درخواست، تمام اجزای صفحه [Default.aspx] از جمله تمام ویوها، نمونهسازی میشوند. هنگام ارسال پاسخ، یکی از آنها توسط کد کنترل برنامه صرفاً با قابلمشاهدهکردن مؤلفهٔ متناظر [View] و پنهانکردن سایرین انتخاب میشود. اگر برنامه نماهای زیادی داشته باشد، صفحه [Default.aspx] دارای کامپوننتهای زیادی خواهد بود و هزینه نمونهسازی آن ممکن است بسیار گزاف شود. علاوه بر این، حالت [Design] صفحه به دلیل داشتن نماهای بسیار زیاد، در معرض خطر غیرقابل مدیریت شدن قرار میگیرد. این نوع معماری برای برنامههایی با تعداد کم نما که توسط یک نفر توسعه داده میشوند، مناسب است. در مواردی که بتوان از آن استفاده کرد، امکان توسعه یک معماری MVC را به سادگی فراهم میکند. این همان چیزی است که در این نسخه جدید به آن خواهیم پرداخت.
8.1. ویوهای برنامه
نمایانههای مختلفی که به کاربر ارائه میشوند به شرح زیر خواهد بود:
- نمای [VueSaisies] که فرم شبیهسازی را نمایش میدهد

- نمای [VueSimulation]، که برای نمایش نتایج دقیق شبیهسازی استفاده میشود:

- نمای [VueSimulations] که شبیهسازیهای انجامشده توسط مشتری را فهرست میکند

- نمای [VueSimulationsVides]، که نشان میدهد مشتری هیچ شبیهسازی ندارد یا دیگر هیچکدام ندارد:

- نما [VueErreurs]، که یک یا چند خطا را نشان میدهد:

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
{
//--- دادههای ثابت برنامه ---
public static Employe[] Employes;
public static string Msg = string.Empty;
public static bool Erreur = false;
public static IPamMetier PamMetier = null;
// راهاندازی برنامه
public void Application_Start(object sender, EventArgs e)
{
...
}
// شروع یک جلسه کاربری
public void Session_Start(object sender, EventArgs e)
{
//یک لیست خالی از شبیهسازیها به جلسه اضافه میشود
Session["simulations"] = new List<Simulation>();
}
}
}
- خطوط ۲۷–۳۴: این بخش شروع جلسه را مدیریت میکند. ما فهرست شبیهسازیهایی را که کاربر در این جلسه انجام داده است ذخیره خواهیم کرد.
- خط ۳۰: یک لیست خالی از شبیهسازیها ایجاد میشود. یک شبیهسازی یک شیء از نوع [Simulation] است که بهزودی با جزئیات بیشتری دربارهاش بحث خواهیم کرد.
- خط ۳۰: یک لیست خالی از شبیهسازیها ایجاد میشود. یک شبیهسازی یک شی از نوع [Simulation] است که بهزودی با جزئیات بیشتری دربارهاش صحبت خواهیم کرد.
8.4. کلاس [Simulation]
یک شیء از نوع [Simulation] برای احاطه یک سطر در جدول شبیهسازی استفاده میشود:

کد آن به شرح زیر است:
namespace Pam.Web
{
public class Simulation
{
//دادههای شبیهسازی
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; }
// سازندهها
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>
- خط ۱۰: تگ مربوط به مدیریت افزونههای Ajax
- خطوط ۱۱–۷۳: کانتینر UpdatePanel، که توسط فراخوانیهای Ajax بهروزرسانی میشود
- خطوط ۱۲–۷۲: محتوای کانتینر UpdatePanel
- خطوط ۱۳–۵۲: هدر (سربرگ) که در هر نما نمایش داده میشود. این بخش فهرستی از اقدامات ممکن را در قالب یک فهرست از پیوندها به کاربر ارائه میدهد.
- خط ۳۳: به ویژگی CausesValidation="False" توجه کنید که تضمین میکند اعتبارسنجهای صفحه هنگام کلیک بر روی لینک، بهطور ضمنی اجرا نخواهند شد. هنگامی که این ویژگی وجود نداشته باشد، مقدار پیشفرض آن True است. اعتبارسنجی صفحه را میتوان بهطور صریح در کد سمت سرور با استفاده از عملیات Page.Validate انجام داد.
- خطوط ۵۳–۵۷: یک کامپوننت [MultiView] با یک ویوی واحد، [VueSaisies]. به همین دلیل، شماره ویوی نمایش داده شده در خط ۵۳ به صورت ثابت کدگذاری شده است: ActiveViewIndex="0"
- خطوط ۵۳–۶۷: یک کامپوننت [MultiView] با چهار نما: نمای [VueSimulation] در خطوط ۵۹–۶۱، نما [VueSimulations] در خطوط 62–64، نما [VueSimulationsVides] در خطوط 65–67، و نما [VueErreurs] در خطوط 68–70. یک کامپوننت [MultiView] در هر زمان تنها یک نما را نمایش میدهد. برای نمایش نما شماره i از کامپوننت Vues2، کد به صورت زیر خواهد بود:
8.5.2. سربرگ en
سربرگ شامل اجزای زیر است:
![]() |
خیر. | نوع | نام | نقش |
LinkButton | LinkButtonFaireSimulation | درخواست محاسبه شبیهسازی | |
LinkButton | LinkButtonEffacerSimulation | فرم ورودی را پاک میکند | |
LinkButton | LinkButtonVoirSimulations | فهرست شبیهسازیهای انجامشده را نمایش میدهد | |
LinkButton | LinkButtonFormulaireSimulation | بازگشت به فرم ورودی | |
LinkButton | LinkButtonEnregistrerSimulation | شبیهسازی فعلی را در فهرست شبیهسازیها ذخیره میکند | |
LinkButton | LinkButtonTerminerSession | خروج از جلسهٔ جاری |
8.5.3. نما [Saisies]
کامپوننت [View]، با نام [VueSaisies]، به شرح زیر است:
![]() |
خیر. | نوع | نام | نقش |
DropDownList | ComboBoxEmployes | حاوی فهرستی از نامهای کارمندان | |
TextBox | TextBoxHeures | تعداد ساعات کاری – واقعی | |
TextBox | TextBoxJours | تعداد روزهای کاری – عدد صحیح | |
RequiredFieldValidator | RequiredFieldValidatorHeures | تأیید میکند که فیلد [2] [TextBoxHeures] خالی نیست | |
RegularExpressionValidator | RegularExpressionValidatorHeures | بررسی میکند که فیلد [2] [TextBoxHeures] یک عدد حقیقی ≥ 0 است | |
RequiredFieldValidator | RequiredFieldValidatorJours | بررسی میکند که فیلد [3] [TextBoxJours] خالی نیست | |
RegularExpressionValidator | RegularExpressionValidatorJours | بررسی میکند که فیلد [3] [TextBoxJours] یک عدد صحیح ≥ 0 است |
8.5.4. نما [Simulation]
کامپوننت [View]، با نام [VueSimulation]، به شرح زیر است:

این شامل صرفاً اجزای [Label] است که اجزای ID در بالا فهرست شدهاند.
8.5.5. نما [Simulations]
کامپوننت [View]، با نام [VueSimulations]، به شرح زیر است:
![]() |
خیر. | نوع | نام | نقش |
GridView | GridViewSimulations | شامل لیست شبیهسازیها |
ویژگیهای مؤلفه [GridViewSimulations] به شرح زیر تعریف شدهاند:
![]() |
- در [1]: روی [GridView] کلیک راست کرده و گزینه [Mise en forme automatique] را انتخاب کنید
- برای [2]: یک نوع نمایش را برای [GridView] انتخاب کنید
![]() |
- در [3]: ویژگیهای [GridView] را انتخاب کنید
- در [4]: ستونهای [GridView] را ویرایش کنید
- در [5]: یک ستون از نوع [BoundField] اضافه کنید که به یکی از ویژگیهای عمومی شیئی که باید در ردیف [GridView] نمایش داده شود، متصل خواهد شد. شیء نمایش داده شده در اینجا از نوع [Simulation] خواهد بود.
![]() |
- در [6]: عنوان ستون را وارد کنید
- در [7]: نام خاصیت کلاس [Simulation] را که با این ستون مرتبط خواهد بود، مشخص کنید.
- [DataFormatString] مشخص میکند که مقادیر نمایشدادهشده در ستون چگونه باید قالببندی شوند.
ستونهای کامپوننت [GridViewSimulations] دارای ویژگیهای زیر هستند:
خیر. | ویژگیها |
نوع: BoundField, HeaderText: نام، DataField: نام | |
نوع: BoundField, HeaderText: نام خانوادگی, DataField: نام | |
نوع: BoundField, HeaderText: ساعات کاری، DataField: HeuresTravaillees | |
نوع: BoundField, HeaderText: روزهای کاری، DataField: JoursTravailles | |
نوع: BoundField, HeaderText: حقوق پایه، DataField: SalaireBase, DataFormatString: {0:C} (قالب ارز، C=Currency) – نماد یورو را نمایش میدهد. | |
نوع: BoundField, HeaderText: مزایای جانبی، فیلد داده: مزایای جانبی، DataFormatString: {0:C} | |
نوع: BoundField، HeaderText: حق بیمههای تأمین اجتماعی، DataField: CotisationsSociales، DataFormatString: {0:C} | |
نوع: BoundField, HeaderText: حقوق خالص، DataField: SalaireNet, DataFormatString: {0:C} |
لطفاً توجه داشته باشید که فیلد [DataField] باید با یک ویژگی موجود در کلاس [Simulation] مطابقت داشته باشد. در پایان این فاز، تمام ستونهای از نوع [BoundField] ایجاد شدهاند:
![]() |
- در [1]: ستونهای ایجاد شده برای [GridView]
- به [2]: هنگام تعریف دستی ستونها توسط توسعهدهنده، ایجاد خودکار ستون باید غیرفعال شود، همانطور که ما همین حالا انجام دادیم.
اکنون باید ستون لینکها را ایجاد کنیم [Retirer]:

![]() |
- در [1]: یک ستون از نوع [CommandField / Supprimer] اضافه کنید
- در [2]: ButtonType=Link تا در ستون یک لینک باشد به جای یک دکمه
- در [3]: CausesValidation=False; کلیک کردن روی لینک هیچیک از بررسیهای اعتبارسنجی موجود در صفحه را فعال نخواهد کرد. این به آن دلیل است که حذف یک شبیهسازی نیازی به اعتبارسنجی دادهها ندارد.
- در [4]: تنها لینک حذف قابل مشاهده خواهد بود.
- در [5]: متن این لینک
8.5.6. نما [SimulationsVides]
کامپوننت [View]، با نام [VueSimulationsVides]، صرفاً حاوی متن است:
8.5.7. نما [Erreurs]
کامپوننت [View]، با نام [VueErreurs]، به شرح زیر است:
![]() |
خیر. | نوع | نام | نقش |
تکرارکننده | RptErreurs | فهرستی از پیامهای خطا را نمایش میدهد |
کامپوننت [Repeater] به شما امکان میدهد کد ASP.NET / HTML را برای هر شیء در یک منبع داده، معمولاً یک مجموعه، تکرار کنید. این کد مستقیماً در کد منبع ASP.NET در صفحه تعریف شده است:
<asp:Repeater ID="RptErreurs" runat="server">
<ItemTemplate>
<li>
<%#Container.DataItem %>
</li>
</ItemTemplate>
</asp:Repeater>
- خط ۲: <ItemTemplate> کدی را تعریف میکند که برای هر عنصر در منبع داده تکرار خواهد شد.
- خط ۴: مقدار عبارت Container.DataItem را نمایش میدهد که به عنصر فعلی در منبع داده اشاره دارد. از آنجا که این عنصر یک شیء است، از متد ToString این شیء برای درج آن در جریان HTML صفحه استفاده میشود. مجموعهٔ اشیاء ما یک List(Of String) حاوی پیامهای خطا خواهد بود. خطوط ۳–۵ توالیهای <li>Message</li> را در جریان HTML صفحه قرار خواهند داد.
8.6. کنترلکننده [Default.aspx.cs]
8.6.1. نمای کلی
بیایید به معماری MVC برنامه بازگردیم:
![]() |
- [Default.aspx.cs] که کد کنترل برای صفحهٔ تک [Default.aspx] است، کنترلکنندهٔ برنامه است.
- [Global] یک شی از نوع [HttpApplication] است که برنامه را راهاندازی میکند و مرجعی به لایه [métier] در خود نگه میدارد.
اسکلت کد برای کنترلکننده [Default.aspx.cs] به شرح زیر است:
using System.Collections.Generic;
...
public partial class PagePam : Page
{
private void setVues(bool boolVues1, bool boolVues2, int index)
{
//نماهای درخواستی نمایش داده میشوند
//boolVues1: true اگر نماهای چندگانه «Vues1» باید قابل مشاهده باشند
//boolVues1: true اگر چندنمای «Vues2» باید قابل مشاهده باشد
// index: نمای نماهای ۲ که باید نمایش داده شود
...
}
private void setMenu(bool boolFaireSimulation, bool boolEnregistrerSimulation, bool boolEffacerSimulation, bool boolFormulaireSimulation, bool boolVoirSimulations, bool boolTerminerSession)
{
// گزینههای منو تنظیم شدهاند
// هر مقدار بولی به ویژگی Visible لینک مربوطه اختصاص داده میشود
...
}
// بارگذاری صفحه
protected void Page_Load(object sender, System.EventArgs e)
{
//پردازش درخواست اولیه
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 (۲۴–۳۱)، اما تست بولی Page.IsPostback (خط ۲۷) به این معنی است که هیچ اقدامی انجام نمیشود.
- رویدادی که به پیوند کلیکشده مرتبط است:
![]() |
- خطوط ۳۳–۳۶: رسیدگی به کلیک روی لینک [1]
- خطوط ۳۸–۴۱: رسیدگی به کلیک روی لینک [2]
- خطوط ۴۳–۴۶: رسیدگی به کلیک روی لینک [3]
- خطوط ۵۸–۶۱: رسیدگی به کلیکها روی لینک [4]
- خطوط ۴۸–۵۱: رسیدگی به کلیکها روی لینک [5]
- خطوط ۵۳–۵۶: رسیدگی به کلیکها روی لینک [6]
برای استخراج توالیهای کد تکرارشونده، دو متد داخلی ایجاد شدهاند:
- setVues، خطوط ۷–۱۴: نما(ها)ی قابل نمایش را مشخص میکند
- setMenu، خطوط ۱۶–۲۱: گزینههای منوی نمایشدادهشده را مشخص میکند
8.6.2. رویداد Load
مطالعهٔ پیشنهادی: مرجع [1]، توسعهٔ WEB با ASP.NET 1.1:
- بخش مربوط به مؤلفه [Repeater] و پیوند دادهها.
نمایش اول که به کاربر ارائه میشود، مربوط به فرم خالی است:

راهاندازی برنامه نیازمند دسترسی به یک منبع داده است که ممکن است با شکست مواجه شود. در این صورت، اولین صفحهای که نمایش داده میشود، یک صفحه خطا است:

رویداد [Load] به همان شیوهای که در نسخههای قبلی ASP.NET پردازش میشود، مدیریت میگردد:
//بارگذاری صفحه
protected void Page_Load(object sender, System.EventArgs e)
{
//پردازش درخواست اولیه
if (!IsPostBack)
{
// خطاهای инициалиزاسيون؟
if (Global.Erreur)
{
//نمایش نما [erreurs]
...
// موقعیتیابی منو
...
return;
}
// بارگذاری نام کارمندان در لیست کشویی
...
// موقعیتیابی منو
...
// نمایش نما [saisie]
...
}
}
سؤال: کد بالا را تکمیل کنید
8.6.3. اقدام: اجرای شبیهسازی
در ادامه، صفحهٔ علامتگذاریشده با (۱) درخواست کاربر است و صفحهٔ علامتگذاریشده با (۲) پاسخی است که توسط وباپلیکیشن برای کاربر ارسال میشود. از صفحهٔ اصلی، کاربر میتواند یک شبیهسازی را آغاز کند:


![]() |
روند انجام این عمل ممکن است به شکل زیر باشد:
protected void LinkButtonFaireSimulation_Click(object sender, System.EventArgs e)
{
// محاسبه حقوق
// آیا صفحه معتبر است؟
Page.Validate();
if (!Page.IsValid)
{
//نمای نمایش [saisie]
...
return;
}
//صفحه معتبر است – ورودیها بازیابی شدهاند
double HeuresTravaillées = ...;
int JoursTravaillés = ...;
// حقوق کارمند محاسبه میشود
FeuilleSalaire feuillesalaire;
try
{
feuillesalaire = ...
}
catch (PamException ex)
{
// نمایش نما [erreurs]
...
return;
}
// نتیجه در جلسه ذخیره میشود
Session["simulation"] = ...
// نمایش نتایج
...
// نمایش دیدگاهها [saisie, employe, salaire]
...
// منوی نمایش
...
}
سؤال: کد بالا را تکمیل کنید
8.6.4. اقدام: ذخیره شبیهسازی
پس از انجام شبیهسازی، کاربر میتواند درخواست ذخیره آن را بدهد:
![]() |

روندی که این عمل را مدیریت میکند ممکن است چیزی شبیه به این باشد:
protected void LinkButtonEnregistrerSimulation_Click(object sender, System.EventArgs e)
{
// شبیهسازی فعلی را در فهرست شبیهسازیهای جلسه ذخیره میکند
...
// نمایش نما [simulations]
...
}
سؤال: کد بالا را تکمیل کنید
8.6.5. اقدام: بازگشت به فرم شبیهسازی
مطالعه پیشنهادی: مرجع [1]، [Développement WEB avec ASP.NET 1.1 ]: نقش فیلد مخفی _VIEWSTATE
پس از نمایش لیست شبیهسازیها، کاربر میتواند درخواست بازگشت به فرم شبیهسازی را بدهد:
![]() |
توجه داشته باشید که صفحه (۲) فرم را همانطور که وارد شده است نمایش میدهد. در اینجا مهم است به خاطر داشته باشید که این نماهای مختلف بخشی از یک صفحه واحد هستند. بین درخواستهای مختلف، مقادیر اجزا توسط مکانیزم ViewState حفظ میشوند، اگر ویژگی EnableViewState این اجزا روی true تنظیم شده باشد.
روند کاری که این اقدام را مدیریت میکند ممکن است چیزی شبیه به این باشد:
protected void LinkButtonFormulaireSimulation_Click(object sender, System.EventArgs e)
{
// نمایش نما [saisie]
...
// موقعیتیابی منو
...
}
سؤال: کد بالا را تکمیل کنید
8.6.6. اقدام: پاک کردن شبیهسازی
پس از بازگشت به فرم شبیهسازی، کاربر میتواند درخواست پاک کردن ورودیهای فعلی را بدهد:
![]() |
روند کاری که این اقدام را مدیریت میکند ممکن است چیزی شبیه به این باشد:
protected void LinkButtonEffacerSimulation_Click(object sender, System.EventArgs e)
{
//RAZ از نوع
...
}
سؤال: کد بالا را تکمیل کنید
8.6.7. اقدام: مشاهده شبیهسازیها
کاربر میتواند درخواست مشاهده شبیهسازیهایی را که قبلاً انجام داده است، بدهد:
![]() |
![]() |
روشی که این اقدام را مدیریت میکند ممکن است چیزی شبیه به این باشد:
protected void LinkButtonVoirSimulations_Click(object sender, System.EventArgs e)
{
//بازیابی شبیهسازیها از جلسه
...
//آیا شبیهسازیهایی وجود دارد؟
if (...)
{
// [simulations] نمای قابل مشاهده
...
}
else
{
// مشاهده [SimulationsVides]
...
}
// منو تنظیم شده است
...
}
سؤال: کد بالا را تکمیل کنید
8.6.8. اقدام: حذف یک شبیهسازی
کاربر میتواند درخواست حذف یک شبیهسازی را بدهد:
![]() |
![]() |
روند [GridViewSimulations_RowDeleting ] که این اقدام را مدیریت میکند، ممکن است به شکل زیر باشد:
protected void GridViewSimulations_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
//بازیابی شبیهسازیها از جلسه
...
//شبیهسازی مشخصشده حذف میشود (e.RowIndex شماره خط حذفشده است)
...
//آیا شبیهسازیهای باقیماندهای وجود دارد؟
if (...)
{
// GridView پر شده است
...
}
else
{
// مشاهده [SimulationsVides]
...
}
}
سؤال: کد بالا را تکمیل کنید
8.6.9. اقدام: پایان جلسه
کاربر میتواند درخواست پایان جلسه شبیهسازی خود را بدهد. این کار محتوای جلسه را حذف کرده و یک فرم خالی نمایش میدهد:
![]() |
![]() |
روندی که این اقدام را مدیریت میکند ممکن است چیزی شبیه به این باشد:
protected void LinkButtonTerminerSession_Click(object sender, System.EventArgs e)
{
// خروج
...
// نمایش نما [saisies]
...
// موقعیتیابی منو
...
}
سؤال: کد بالا را تکمیل کنید
تمرین عملی: اپلیکیشن وب قبلی را روی یک ماشین پیادهسازی کنید. قابلیت Ajax را به آن اضافه کنید.






















