مقدمه
اگر شخص با سابقهای در دنیای فناوری اطلاعات و سیستمهای کامپیوتری باشید، زمانیکه کلمهی CodeBehind را میبینید یا میشونید، اولین نکتهای که به ذهن شما خطور میکند، صفحات Web-Form مایکروسافت در ASP.NET Standard است که دارای پسوند aspx هستند و بخش طراحی وب را از بخش کدهای سمت سرور جدا میکنند. مایکروسافت در گذشته اصرار زیادی به CodeBehind داشت (هرچند در حال حاضر، مایکروسافت الگوی MVC را پیشنهاد میکند). در JSP نیز امکان برنامه نویسی و طراحی وب با صفحات JSP با الگوی CodeBehind امکان پذیر بود؛ اما Web-Form مایکروسافت به صورت پیش فرض، مبتنی بر CodeBehind بود. البته باید این نکته را در نظر گرفت که CodeBehind یک الگوی برنامه نویسی هست و ربطی به Web-Form مایکروسافت یا JSP در جاوا ندارد و همچنان پرکاربرد هست.
در این مقاله به MVC و همین طور صفحات aspx اشاره میکنیم اما به طور کامل به CodeBehind خواهیم پرداخت؛ البته یک CodeBehind دیگر!
اگر ASP.NET Core را یک اسب قدرتمند وصف کنیم که بر روی زمین با غرور و افتخار میتازد، CodeBehind تحقق رویای یک سوارکار خردسال است که بر روی آن اسب سوار میشود و اسب را به پرواز در میآورد. CodeBehind
جدید است، کوچک است، ساده است، بی نشان است؛ اما بسیار قدرتمند و منعطف است. ابایی از سرشاخ شدن با ساختار ASP.NET Core ندارد و خود را الماس دات نت مینامد. CodeBehind یک انقلاب در دات نت است که از صدای یک اعتراض حاصل شده؛ اعتراض به ساختار پیچیده، خشک و غیرقابل انعطاف ASP.NET Core و وضعیت آشفته و غیرقابل درک Controller آن (درک از باب چرایی وجود ساختار).
نکته هایی قبل از خواندن مقاله:
-
لطفا توجه داشته باشید که در هر قسمت از متن مقاله که به ASP.NET Core اشاره شدهاست، منظور برنامه نویسی با صفحات پیش فرض cshtml در ASP.NET Core است.
-
همچنین توجه داشته باشید که هرجای مقاله که از وبپارت (Web-Part یا بخش-وب) صحبت میکنیم، منظور ما میتواند افزونه، پلاگین، ماژول و غیره باشد. اگر مقاله را تا آخر بخوانید متوجه منظور ما از وبپارت خواهید شد.
-
برای تست کردن و یا شروع کار با CodeBehind، آخرین نسخهی آن را استفاده کنید؛ زیرا در این مقاله به ویژگیهایی میپردازیم که مربوط به نسخههای آخرین هست. در زمان نگارش این مقاله، CodeBehind روی نسخه 1.5.2 میباشد. جالب است بدانید نخستین نسخه CodeBehind، از فایلهای پیش فرض Default.aspx پشتیبانی نمیکند، بنابراین بهتر است آخرین نسخه این
فریم ورک را استفاده کنید.
-
CodeBehind بر روی نسخهی 7.0 دات نت، پیاده سازی شده.
CodeBehind چیست؟
CodeBehind یک فریم ورک جدید بکاند (Back-End) است که از الگوی MVC برای ساخت صفحات وب پشتیبانی میکند. CodeBehind صفحات aspx را به ASP.NET Core برمیگرداند و استقلال سمت سرور بالایی دارد. CodeBehind رایگان و منبع باز است.
صفحات aspx در CodeBehind، نقش View را در الگوی MVC دارند. این صفحات در root برنامه حضور فیزیکی دارند.
آیا CodeBehind قابل اعتماد است؟
CodeBehind یک فریم ورک پایدار و قابل اعتماد است. CodeBehind مبتنی بر ASP.NET Core است که یک چارچوب بسیار مطمئن و شناخته شدهاست که توسط مایکروسافت پشتیبانی میشود.
Elanat یکی از قدرتمندترین و بزرگترین سیستمهای دات نت است که با استفاده از فریم ورک CodeBehind پیاده سازی شدهاست.
مزایای CodeBehind
-
CodeBehind یک چارچوب انعطاف پذیر است. CodeBehind تمام مزایای ASP.NET Core را به ارث برده و به آن، سادگی، قدرت و انعطاف بیشتری میدهد.
-
هر سیستمی که با بکارگیری CodeBehind ایجاد شود، خودبهخود، ماژولار است و از وبپارت پشتیبانی میکند. جالب است بدانید خود آن سیستم نیز یک وبپارت است و میتوان آن را در سیستمهای دیگر به عنوان وبپارت اضافه کرد.
-
CodeBehind مانند ASP.NET Core پیش فرض، از چندین پلتفرم پشتیبانی میکند و در تست انجام شده توسط تیم Elanat Framework، از پایداری بالایی در لینوکس نیز برخوردار است.
-
CodeBehind نسبت به ASP.NET Core منابع حافظه (رم) کمتری را اشغال میکند.
-
صفحات aspx در CodeBehind کامپایل میشوند و فراخوانی آنها با سرعت بسیار بالایی انجام میشود؛ بهطوریکه در حین فراخوانی، حتی به مسیر فایل aspx اشاره نمیشود.
-
CodeBehind کنترل کاملی بر روی درخواستهای ورودی و پاسخهای خروجی دارد؛ فرآیند کنترل، داینامیک و ماژولار و قاعدهمند است؛ کنترلی که middleware در دات نتکور هرگز به شما نمیدهد. البته همچنان میتوانید در کنار CodeBehind از middleware در دات نت کور استفاده کنید.
معماری CodeBehind
یکی از ویژگیهای عالی که CodeBehind در اختیار شما قرار میدهد، پشتیبانی از کتابخانههای DLL است. میتوانید تمام کتابخانههای DLL دات نتکور را که ایجاد کردهاید به فهرست bin واقع در wwwroot اضافه کنید تا CodeBehind همه آنها را فراخوانی کند.
چگونه وب-پارت را اضافه کنیم؟
ابتدا فایلهای پروژهی کامپایل شدهی خود را در مسیر دلخواهی در wwwroot کپی کنید. سپس فایل dll اصلی را در مسیر wwwroot/bin کپی کنید. میتوانید درحالیکه فرآیند در متد در حال اجرا است، کپی را انجام دهید و سپس کدهای زیر را برای کامپایل بدون راه اندازی مجدد برنامه فراخوانی کنید.
// Recompile
CodeBehindCompiler.Initialization();
CodeBehindCompiler.CompileAspx();
MVC ساده و ساختیافته در CodeBehind
این مثال ساده، پیاده سازی یک سیستم تحت وب را با بکارگیری فریم ورک CodeBehind آموزش میدهد.
بخش View (یک فایل با نام Default.aspx) <%@ Page Controller="YourProjectName.DefaultController" Model="YourProjectName.DefaultModel" %><!DOCTYPE html>
<html>
<head> <meta charset="utf-8" /> <title><%=model.PageTitle%></title>
</head>
<body> <%=model.BodyValue%>
</body>
</html>
بخش Model (یک کلاس با نام DefaultModel.cs) using CodeBehind;
namespace YourProjectName
{ public partial class DefaultModel : CodeBehindModel { public string PageTitle { get; set; } public string BodyValue { get; set; } }
}
بخش Controller (یک کلاس با نام DefaultController.cs) using CodeBehind;
namespace YourProjectName
{ public partial class DefaultController : CodeBehindController { public DefaultModel model = new DefaultModel(); public void PageLoad(HttpContext context) { model.PageTitle = "My Title"; model.BodyValue = "HTML Body"; View(model); } }
}
همانطور که مشاهده میکنید یک ساختار فوق العاده در بخش Controller وجود دارد: در آن تابعی با نام PageLoad وجود دارد که با هر درخواست به صفحات aspx، این تابع فراخوانی میشود.
پیکرهبندی کلاس Program (فایل Program.cs) using CodeBehind;
using SetCodeBehind;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{ app.UseExceptionHandler("/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts();
}
app.UseStaticFiles();
+ CodeBehindCompiler.Initialization();
app.Run(async context =>
{
+ CodeBehindExecute execute = new CodeBehindExecute();
+ await context.Response.WriteAsync(execute.Run(context));
+ await context.Response.CompleteAsync();
});
app.Run();
دقت کنید که using های بالای کلاس Program.cs و مواردی که با حرف + مشخص شدهاند را لازم است اضافه کنید. در app.Run یک شیء جدید از کلاس CodeBehindExecute ساخته میشود و مقدار context را بهعنوان آرگومان ورودی در متد Run اضافه میکند. همانطور که مشخص هست، خروجی متد Run نیز در پاسخ خروجی نوشته میشود.
اگر مقدار true را در متد ()CodeBehindCompiler.Initialization وارد کنید، تا زمانیکه فایل CodeBehindLastSuccessCompiled.dll.tmp در کنار فایلهای dll اصلی برنامه وجود داشته باشد، کامپایل مجدد انجام نخواهد شد. انجام این کار باعث میشود سرعت پاسخگویی به درخواستها پس از اولین درخواست، از زمانیکه برنامه به حالت خواب میرود بالا باشد.
CodeBehindCompiler.Initialization(true);
توجه: اگر کلاس Program.cs را به این صورت پیکرهبندی کنید، هرگونه تغییر در فایلهای aspx یا افزودن وبپارت جدید یا حذف وبپارت، نیازمند حذف فایل CodeBehindLastSuccessCompiled.dll.tmp است.
میتوانید از متد Write در کلاسهای مدل و کنترلر استفاده کنید. متد Write یک مقدار رشتهای را به ویژگی ResponseText اضافه میکند. شما همچنین میتوانید مقادیر ویژگی ResponseText را با دسترسی مستقیم به آنها تغییر دهید.
در کلاس کنترلر، یک ویژگی به نام ویژگی IgnoreViewAndModel وجود دارد و اگر ویژگی IgnoreViewAndModel را فعال کنید، مقادیر Model و View را نادیده میگیرد و فقط یک صفحه خالی را خواهید دید. این ویژگی به شما امکان میدهد مقادیر مورد نیاز خود را به کاربر نمایش دهید و از تغییر مسیرها و انتقالهای متعدد جلوگیری کنید.
توجه: اگر نام مدلی را در فایل aspx تنظیم کردهاید، باید مطمئن شوید که در انتهای متد در کلاس Controller متد View(ModelName) را فراخوانی کرده و یا مقدار IgnoreViewAndModel را روی true تنظیم کرده باشید.
برای دریافت اطلاعات ارسالی از طریق فرم میتوانید دستورالعمل زیر را دنبال کنید:
public DefaultModel model = new DefaultModel();
public void PageLoad(HttpContext context)
{ if (!string.IsNullOrEmpty(context.Request.Form["btn_Add"])) btn_Add_Click(context); View(model);
}
private void btn_Add_Click(HttpContext context)
{ model.PageTitle = "btn_Add Button Clicked"; model.FileUploadValue = context.Request.Form.Files["upd_FileUpload"]; model.AcceptChechedValue = context.Request.Form["cbx_AcceptCheched"] == "on"; model.GuestNameValue = context.Request.Form["txt_GuestName"];
}
ارسال دادهها از طریق متد فرم، در کدهای بالا نشان داده شدهاست. میتوانید سادگی و قابل فهم بودن کد را مشاهده کنید.
با استفاده از CodeBehind، میتوانید خروجی هر صفحه را در هر صفحهای دیگر (یا هرجایی) فراخوانی کنید.
صفحه aspx <%@ Page Controller="YourProjectName.DefaultController" Model="YourProjectName.DefaultModel" %><!DOCTYPE html>
<html>
<head> <meta charset="utf-8" /> <title><%=model.PageTitle%></title>
</head>
<body> <%=model.LeftMenuValue%> <div> <%=model.MainContentValue%> </div> <%=model.RightMenuValue%>
</body>
</html>
کلاس Controller using CodeBehind;
namespace YourProjectName
{ public partial class DefaultController : CodeBehindController { public DefaultModel model = new DefaultModel(); public void PageLoad(HttpContext context) { model.PageTitle = "My Title"; CodeBehindExecute execute = new CodeBehindExecute(); // Add Left Menu Page model.LeftMenuValue = execute.Run(context, "/menu/left.aspx"); // Add Right Menu Page model.RightMenuValue = execute.Run(context, "/menu/right.aspx"); // Add Main Content Page model.MainContentValue = execute.Run(context, "/pages/main.aspx"); View(model); } }
}
هر یک از صفحات left.aspx، right.aspx و main.aspx میتوانند چندین فایل aspx دیگر را نیز فراخوانی کنند. این فراخوانیها قطعا میتوانند پویا باشند و افزونهای اجرا شود که برنامه نویسان هستهی پروژه، حتی از آن اطلاعی ندارند.
حتی میتوانید صفحاتی را با اضافه کردن کوئری استرینگ فراخوانی کنید.
CodeBehindExecute execute = new CodeBehindExecute();
model.MainContentValue = execute.Run(context, "/pages/main.aspx?template=1");
همچنین میتوانید یک صفحه را بدون تعیین HttpContext فراخوانی کنید. باید
توجه داشته باشید که query string و دادههای HttpContext در این روش
پشتیبانی نمیشوند.
CodeBehindExecute execute = new CodeBehindExecute();
model.MainContentValue = execute.Run("/pages/main.aspx");
همچنین میتوانید مسیری را فراخوانی کنید که در زمان اجرا مشخص میشود و ممکن است در طول زمان تغییر کند.
string MainPage = Pages.GetDefaultPage();
CodeBehindExecute execute = new CodeBehindExecute();
model.MainContentValue = execute.Run(context, MainPage);
در فراخوانی صفحات مراقب باشید برنامه را لوپ نکنید (صفحاتی را که صفحهی فعلی را فراخوانی میکنند، فراخوانی نکنید).
خطایابی
پس از اجرای پروژه، CodeBehind یک دایرکتوری را به نام code_behind در کنار دایرکتوری wwwroot ایجاد میکند. در این دایرکتوری، کلاس View که از فایلهای aspx ساخته شدهاست، نگهداری میشود. اگر در فایلهای aspx خطایی وجود داشته باشد، در فایل views_compile_error.log نمایش داده میشود. همچنین موارد دیگری مثل لیست کتابخانههای dll و موارد دیگر مربوط به این فریم ورک نیز در این دایرکتوری نگهداری میشوند.
وبپارت
CodeBehind، از وبپارت پشتیبانی میکند. وبپارتها همانند سایر بخشهای پروژه هستند و شامل فایلهای aspx میباشند.
برای اضافه کردن وبپارت در CodeBehind، کافی است فایلهای پروژه را در root سیستم تحت وب قرار دهید.
در CodeBehind شما میتوانید تمامی فایلهای aspx را در حین اجرای پروژه و پاسخگویی به کاربران ویرایش کنید. CodeBehind به شما اجازه میدهد صفحات aspx یک وبپارت را در هنگام اضافه کردن همان وبپارت، اجرا کنید.
در CodeBehind، ساختار وبپارتها همانند ساختار پروژه اصلی است؛ بهطوریکه پروژهی اصلی شما شامل صفحات aspx، فایلهای dll و سایر فایلهای سمت سرور یا کلاینت (css، js، تصاویر و غیره) است و هر وبپارت نیز شامل صفحات aspx، فایلهای dll و سایر فایلهای سمت سرور و کلاینت است.
پروژهای که با استفاده از CodeBehind ایجاد میشود، بهطور خودکار یک پروژهی ماژولار است؛ یعنی قابلیت افزودن بخشهای وب را دارد. علاوه بر این، هر وبپارت میتواند در پروژههای دیگر نیز استفاده شود.
سیستم ساخته شده با CodeBehind نیز خود یک بخش وب است. هر قسمت وب نیز میتواند یک سیستم جداگانه باشد! قسمت وب که پیکرهبندی کلاس Program.cs را اضافه میکند، سیستم اصلی در نظر گرفته میشود.
ایجاد سیستمهای پیشرفته با بهکارگیری CodeBehind
CodeBehind کنترل کاملی بر روی درخواستها و پاسخها دارد.
میخواهیم ایجاد چندین سیستم پیشرفته را به شما آموزش دهیم؛ این سیستمها به ترتیب سیستم ماژولار، کار برنامه ریزی شده، راه اندازی اولیه، لیست مرجع قبل از اجرا و لیست مرجع پس از اجرا هستند. البته این آموزشها به صورت کلی هستند و وارد جزئیات ایجاد کلاسها و متدها نمیشویم.
چگونه میتوان سیستمهای ماژولار را با فریم ورک CodeBehind ایجاد کرد؟
همانطور که قبلتر اشاره شد، پروژهای که با استفاده از CodeBehind ایجاد میشود، بهطور خودکار یک پروژهی ماژولار است؛ یعنی قابلیت افزودن وبپارت را دارد. علاوه بر این، هر وبپارت میتواند در پروژههای (سیستمهای) دیگر نیز استفاده شود.
شما میتوانید یک صفحه برای درج یک ماژول (وبپارت) را در صفحهی مدیریت سیستم خود اضافه کنید. این صفحه باید شامل یک ورودی برای آپلود باشد و پس از کپی کردن، مجددا متدهای کامپایل CodeBehind را اجرا کنید. طبق کدهای زیر:
// Recompile
CodeBehindCompiler.Initialization();
CodeBehindCompiler.CompileAspx();
چگونه میتوان سیستم وظایف برنامه ریزی شده را با فریم ورک CodeBehind ایجاد کرد؟
ابتدا یک فایل xml (یا json یا ini یا غیره) مشابه فایل زیر ایجاد کنید:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<scheduled_tasks_root> <scheduled_tasks_list> <scheduled_task name="empty_tmp_directory" path="/action/system_access/scheduled_tasks/empty_tmp_directory/Default.aspx" active="true" corn_hour="86400" type="load" check_type="page" last_run="20230830010903" /> <scheduled_task name="empty_session_data_directory" path="/action/system_access/scheduled_tasks/empty_session_data_directory/Default.aspx" active="true" corn_hour="86400" type="load" check_type="page" last_run="20230830010903" /> <scheduled_task name="active_delay_content" path="/action/system_access/scheduled_tasks/active_delay_content/Default.aspx" active="true" corn_hour="600" type="load" check_type="page" last_run="20230830010903" /> <scheduled_task name="delete_robot_blocked_ip" path="/action/system_access/scheduled_tasks/delete_robot_blocked_ip/Default.aspx" active="true" corn_hour="600" type="load" check_type="page" last_run="20230830010903" /> </scheduled_tasks_list>
</scheduled_tasks_root>
وظایف برنامه ریزی شده، یکی از مهمترین بخشهای یک پروژهی سطح بالا است. میتوانید متد اجرای ScheduledTask را در متد Run در سازنده واقع در کلاس Program.cs اجرا کنید.
app.Run(async context =>
{
+ ScheduledTask.Run(context); CodeBehindExecute execute = new CodeBehindExecute(); await context.Response.WriteAsync(execute.Run(context)); await context.Response.CompleteAsync();
});
شما میتوانید کار برنامه ریزی شده را با هر بار درخواست کلاینت و یا ایجاد یک تایمر استاتیک انجام دهید.
توجه: میتوانید هر دو را (طبق درخواست و طبق تایمر) به صورت ترکیبی پیاده سازی کنید.
چگونه با فریمورک CodeBehind سیستم راه اندازی اولیه ایجاد کنیم؟
ابتدا یک فایل xml (یا json یا ini یا غیره) مشابه فایل زیر را ایجاد کنید:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<start_up_root> <start_up_list> <start_up name="start_timer" path="/action/system_access/start_up/start_timer/Default.aspx" active="true" /> <start_up name="send_start_project_email_to_provider" path="/action/system_access/start_up/send_start_project_email_to_provider/Default.aspx" active="true" /> </start_up_list>
</start_up_root>
راهاندازی اولیهی ساختاری است که به شما اجازه میدهد تا قبل از فعال شدن برنامه، برخی از موارد را مقداردهی اولیه کنید. میتوانید متد Startup را قبل از متد Run، در سازندهی واقع در کلاس Program.cs اجرا کنید.
+ Startup.Run();
app.Run(async context =>
{ CodeBehindExecute execute = new CodeBehindExecute(); await context.Response.WriteAsync(execute.Run(context)); await context.Response.CompleteAsync();
});
توجه: درفریم ورک CodeBehind نسخه 1.5.1 (و نسخههای بعدی) میتوانید متد Run را در CodeBehindExecute بدون نیاز به HttpContext فراخوانی کنید.
CodeBehindExecute execute = new CodeBehindExecute();
execute.Run(StartupNodePath);
در کد بالا، رشته StartupNodePath میتواند مسیری مانند زیر باشد:
/action/system_access/start_up/send_start_project_email_to_provider/Default.aspx
چگونه توسط فریمورک CodeBehind سیستم مرجع مدیریت قبل از اجرا ایجاد کنیم؟
ابتدا یک فایل xml (یا json یا ini یا غیره) مشابه فایل زیر را ایجاد کنید:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<before_load_path_reference_root> <before_load_path_reference_list> <reference type="url" check_type="page" exist="true" start_by="false" end_by="false" regex_match="false" active="false" reason="login_try_count_limitation_is_active"> <path_value>btn_Login=</path_value> <load_value><![CDATA[/action/system_access/reference/check_login_try_count_limitation/Default.aspx]]></load_value> </reference> <reference type="form" check_type="page" exist="true" start_by="false" end_by="false" regex_match="false" active="false" reason="login_try_count_limitation_is_active"> <path_value>btn_Login=</path_value> <load_value><![CDATA[/action/system_access/reference/check_login_try_count_limitation/Default.aspx]]></load_value> </reference> <reference type="url" check_type="page" exist="true" start_by="false" end_by="false" regex_match="false" active="true" reason="lock_login_is_active"> <path_value>btn_Login=</path_value> <load_value><![CDATA[/action/system_access/reference/check_lock_login/Default.aspx]]></load_value> </reference> <reference type="form" check_type="page" exist="true" start_by="false" end_by="false" regex_match="false" active="true" reason="lock_login_is_active"> <path_value>btn_Login=</path_value> <load_value><![CDATA[/action/system_access/reference/check_lock_login/Default.aspx]]></load_value> </reference> <reference type="url" check_type="page" exist="true" start_by="false" end_by="false" regex_match="false" active="true" reason="next_search_time_interval_limitation_is_active"> <path_value>btn_Search=</path_value> <load_value><![CDATA[/action/system_access/reference/check_next_search_time_interval_limitation/Default.aspx]]></load_value> </reference> <reference type="form" check_type="page" exist="true" start_by="false" end_by="false" regex_match="false" active="true" reason="next_search_time_interval_limitation_is_active"> <path_value>btn_Search=</path_value> <load_value><![CDATA[/action/system_access/reference/check_next_search_time_interval_limitation/Default.aspx]]></load_value> </reference> </before_load_path_reference_list>
</before_load_path_reference_root>
میتوانید مسیرهای url را قبل از اجرا کنترل کنید. مثال بالا نشان میدهد که میتوانید صفحات aspx را قبل از اجرای مسیر اجرا کنید و دسترسی به مسیرها را ممنوع کنید یا ابرمتن خروجی را تغییر دهید یا به آن اضافه کنید. اولین مرجع در فایل xml بالا نشان میدهد که محدودیتی برای ورود به صفحهی ورود، وجود دارد. هربار که کاربر بر روی دکمهی ورود کلیک میکند، صفحهی aspx اجرا میشود و تعداد تلاشهای ورود به سیستم، یک بار از جلسه کاهش مییابد. اگر این مقدار 0 شود، اجازه ورود را نمیدهد.
میتوانید متد BeforeLoadPathReference را در متد Run در سازنده (قبل از اجرای صفحه) واقع در کلاس Program.cs اجرا کنید.
app.Run(async context =>
{
+ BeforeLoadPathReference.Run(context); CodeBehindExecute execute = new CodeBehindExecute(); await context.Response.WriteAsync(execute.Run(context)); await context.Response.CompleteAsync();
});
چگونه توسط فریمورک CodeBehind سیستم مرجع مدیریت بعد از اجرا را ایجاد کنیم؟
ابتدا یک فایل xml (یا json یا ini یا غیره) مشابه فایل زیر را ایجاد کنید:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<after_load_path_reference_root> <after_load_path_reference_list> <reference type="url" check_type="page" exist="false" start_by="true" end_by="false" regex_match="false" active="true"> <path_value>/upload/attachment/</path_value> <load_value><![CDATA[/action/system_access/reference/increase_attachment_visit/Default.aspx]]></load_value> </reference> </after_load_path_reference_list>
</after_load_path_reference_root>
شما همچنین این امکان را دارید که مسیرهای url را پس از اجرا کنترل کنید. مثال بالا نشان میدهد که میتوانید صفحات aspx را پس از اجرای مسیر اجرا کنید. در فایل xml بالا میبینید که بعد از درخواستها، یک صفحهی aspx در مسیر /upload/attachment/ اجرا میشود و اگر مسیر، یک فایل موجود در مسیر و پایگاه داده باشد، مقدار تعداد دانلود فایل پیوست در پایگاه داده، یک عدد اضافه میشود.
میتوانید متد AfterLoadPathReference را در متد Run، در سازنده (بعد از اجرای صفحه) واقع در کلاس Program.cs اجرا کنید.
app.Run(async context =>
{ CodeBehindExecute execute = new CodeBehindExecute(); await context.Response.WriteAsync(execute.Run(context));
+ AfterLoadPathReference.Run(context); await context.Response.CompleteAsync();
});
پیاده سازی ساختارهای ذکر شده در بالا، ویژگیهای پیشرفتهای به سیستم شما میدهد و آن را قابل تنظیم میکند. مشتریان سیستم شما ممکن است بخواهند مواردی را اضافه کنند که شما حتی در مورد آنها نمیدانید.
چرا اسم این فریم ورک CodeBehind است؟
همان طور که در ابتدای مقاله اشاره کردیم CodeBehind یک سبک، ساختار یا الگوی برنامه نویسی و توسعه نرم افزار است. در این الگو توسعه سمت سرور از بخش View جدا میشود و مدیریت پروژه به آسانی انجام میشود. جداسازی کدهای سمت سرور از صفحات View باعث میشود که تیم طراحی وب (یا برنامه نویسان فریم ورکهای کلاینت) از تیم برنامه نویسی سرور جدا شود و هر یک از آنها بدون نیاز به ارتباط با یکدیگر کار خود را به پیش ببرند.
کد بخش ذیل را توسعه دهندگان سمت کلاینت به راحتی درک میکنند.
میتوان در الگوی MVC نیز تا حدودی CodeBehind را نیز رعایت کرد، اما زمانی که لازم است از یک حلقه یا شرط استفاده شود، شرایط به هم میریزد.
نمونه هایی از کدنویسی سمت سرور در بخش View
<table> <thead> <tr> <th>Column1</th> <th>Column2</th> <th>Column3</th> </tr> </thead> <tbody> @foreach (var item in Model) { <tr> <td>@item.Column1</td> <td>@item.Column2</td> <td>@item.Column3</td> </tr> } </tbody>
</table>
نمونه ای از ترکیب تگهای HTML با کدهای سمت سرور
model.ListValue = "<ul>";
foreach(string s in List) model.ListValue += "<li>" + s + "</li>";
model.ListValue += "</ul>";
همان طور که مشاهده میکنید اینجا کار برای توسعه دهنگان بکاند و فرانتاند گره میخورد.
پاسخ Elanat Framework به همین پرسش
ما در تیم elanatframework میخواهیم فریم ورک CodeBehind را به گونهای گسترش دهیم که نیازی به نوشتن کدهای سمت سرور در صفحات View نباشد و نیازی به ترکیب اجزای مربوط به صفحات سمت کلاینت با کدهای سمت سرور نباشد. به همین دلیل نام CodeBehind را برای فریم ورک خود انتخاب کردیم. معمولاً نیاز مهمی به ایجاد حلقههای for، foreach و while در بخش View وجود دارد و ما در آینده راهحل مناسبی برای آن ارائه خواهیم کرد (البته ما همچنان به کدنویسی سمت سرور در View اجازه میدهیم!).
سخن پایانی
CodeBehind کد قابل فهمی تولید میکند، در حالیکه بخش Controller در ASP.NET Core یک وضعیت آشفته و پیچیدهاست. قدرتی را که چارچوب CodeBehind به شما میدهد، هرگز در ASP.NET Core تجربه نخواهید کرد. CodeBehind مقادیر نهایی صفحات خود را خارج از Response در HttpContext
ذخیره میکند. میتوانید خروجی مقادیر نهایی را در صفحات aspx قبل از پاسخ ،
ویرایش کنید. این به شما کنترل بیشتری نسبت به ASP.NET Core میدهد. توسعه دهندگان دات نت CodeBehind را به عنوان بخشی از اکوسیستم بزرگتر دات
نت در نظر بگیرند. هر مزیتی که CodeBehind داشته باشد متعلق به جامعه دات نت
است. CodeBehind مشابه فریمورکهای تفسیر شده مانند جنگو و لاراول است و برنامه
نویسان پروژههای زبان برنامه نویسی تفسیر شده میتوانند به راحتی با
CodeBehind برنامه نویسی کنند. توسعه دهندگان چارچوبهای تفسیری میتوانند CodeBehind را به عنوان یک جایگزین در نظر داشته باشند.
لینک به بیرون
فیلمهای آموزش CodeBehind (در YouTube) مثال !Hello World دانلود نرم افزار و برنامه...