برنامه نویسی

چرا باید از Code-Behind استفاده کنیم؟

یکی از توسعه دهندگان محترم دات نت سوالی از الانت پرسید. پاسخ ما به او طولانی تر از آن چیزی بود که در یک کامنت گفته شود. بنابراین تصمیم گرفتیم یک مقاله جدید برای کمک به توسعه دهندگان دیگر ایجاد کنیم.

سوال او این بود:

سلام! من یک سوال کوچک در مورد این بخش از مقاله شما دارم:

کتابخانه قدرتمند Code-Behind این امکان را به Elanat می دهد که در ارائه ویژگی های جدید در مقایسه با ساختار پیش فرض dot net core MVC که شامل صفحات cshtml می شود، آزادی بیشتری داشته باشد و از محدودیت های غیر ضروری هسته aspdotnet مایکروسافت که توسط سیستم های dot net مشابه استفاده می شود، جلوگیری کند.

آیا می توانید توضیح دهید که چه نوع محدودیت های غیر ضروری را تجربه می کنید که کد پشت آن وجود ندارد؟ من شخصاً بیشتر اوقات از روش MVC با تیغ استفاده می کنم و کاملاً برعکس آن را احساس می کنم. ناگفته نماند، صفحات ریزر کاملاً شبیه به نظر می رسند به این معنا که شما یک صفحه ریش تراش همراه با یک فایل C# با روش بارگذاری صفحه مشابه دارید. آنها فقط نحو متفاوتی دارند. من کنجکاو هستم که چگونه صفحات aspx با کد پشت سر به نظر شما بهتر هستند.

دنیس عزیز
از نظرات شما سپاس گزارم

ما در مورد نحو Razor و نحوه مقایسه آن با نحو تگ های <% %> و <%= %> که در جاوا JSP یا Microsoft asp و aspx صفحات وب استفاده می شد یا هنوز استفاده می شود صحبت نکردیم. حتی می‌توان در آینده پشتیبانی نحوی Razor را به زیرساخت Code-Behind اضافه کرد.

در آن پاراگراف (که شما نقل کردید) استفاده از کلمات cshtml pages برای تأکید بر ساختار پیش‌فرض دات‌نت کور بود.

وجود فایل فیزیکی قابل اجرا (aspx) در روت، برنامه شما را ساختارمندتر می کند. توجه داشته باشید که پس از اجرای برنامه و کامپایل صفحات aspx توسط Code-Behind، برنامه شما دیگر به هیچ یک از فایل های aspx مراجعه نخواهد کرد.

اگر مقیاس برنامه ای که می سازید زیاد است یا باید به صورت پویا عمل کنید، استفاده از Code-Behind قطعا آزادی بیشتری به شما می دهد.
اگر مقیاس برنامه کم است، استفاده از Code-Behind برنامه شما را ساده می کند و کد سریعتر و قابل فهم تری تولید می کنید.

مثال زیر قدرت Code-Behind را نشان می دهد:

صفحه aspx

<%@ Page Controller="YourProjectName.wwwroot.DefaultController" Model="YourProjectName.wwwroot.DefaultModel" %><!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title><%=model.PageTitle%></title>
</head>
<body>
    <%=model.LeftMenuValue%>
    <div class="main_content">
        <%=model.MainContentValue%>
    </div>
    <%=model.RightMenuValue%>
</body>
</html>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کلاس کنترلر

using CodeBehind;

namespace YourProjectName.wwwroot
{
    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
            context.Request.Path = "/menu/left.aspx";
            model.LeftMenuValue = execute.Run(context);


            // Add Right Menu Page
            context.Request.Path = "/menu/right.aspx";
            model.RightMenuValue = execute.Run(context);


            // Add Main Content Page
            context.Request.Path = "/pages/main.aspx";
            model.MainContentValue = execute.Run(context);

            View(model);
        }
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

هر یک از صفحات left.aspx، right.aspx و main.aspx می توانند چندین فایل aspx دیگر را نیز فراخوانی کنند. این تماس ها قطعا می توانند پویا باشند و افزونه ای اجرا شود که برنامه نویسان هسته حتی از آن اطلاعی ندارند.

از Code-Behind لذت ببرید، اما مراقب باشید برنامه را لوپ نکنید! (صفحاتی را که صفحه فعلی را فراخوانی می کنند تماس نگیرید)

Code-Behind هنگام اجرای برنامه چه قدرتی به شما می دهد؟

دسترسی به محتوای فرامتن صفحات و جایگزینی برخی مقادیر قبل از فراخوانی در صفحات دیگر.

مایکروسافت معمولاً دستان شما را می بندد تا نتوانید یک سیستم پویا ایجاد کنید.

با استفاده از معماری پیش فرض ASP.NET Core مایکروسافت، با چالش های بسیار بزرگی روبرو خواهید شد. ایجاد سیستمی با قابلیت پشتیبانی از افزونه ها که هم امنیت را تامین کند و هم لوپ نکند و بتواند صفحات دیگر را در صفحات شما فراخوانی کند، بسیار چالش برانگیز است.

ما بر بسیاری از چالش‌ها در نسخه‌های دات‌نت استاندارد غلبه کردیم تا با استفاده از دات‌نت ساختاری افزودنی ایجاد کنیم.

برای مشاهده گوشه ای از مبارزه ما با محدودیت های دات نت می توانید به صفحات زیر مراجعه کنید:
https://github.com/elanatframework/Elanat/blob/elanat_framework/PathHandlersLoader.aspx.cs
https://github.com/elanatframework/Elanat/blob/elanat_framework/PageHandlersLoader.aspx.cs

فرض کنید برنامه ای را با استفاده از ASP.NET Core cshtml پیش فرض ایجاد کرده اید که یک صفحه اصلی شامل یک منوی سمت راست و یک منوی سمت چپ دارد. همانطور که در کد بالا نشان دادیم، آیا می توانید مقادیر این منوها را به صورت پر کردن فرم پویا با صفحات cshtml تغییر دهید و مقادیر به دست آمده از صفحات را جایگزین کنید؟ قطعا ممکن است، اما دشوار است.
Code-Behind حتی برای فراخوانی صفحات aspx به فایل aspx فیزیکی مراجعه نمی کند و فقط یک متد را فراخوانی می کند.

چگونه رویدادها را در ASP.NET Core مدیریت می کنید؟
مثلا مسیری از برنامه شما که نیاز به چند متد برای اجرا دارد و این متدها در هسته برنامه شما وجود ندارد! این کار را می توان با cshtml پیش فرض دات نت کور کرد، اما دشوار است.
مثلاً قبل از درخواست به صفحه جستجو یک رویداد داشته باشیم و اجازه ندهیم کاربر در هر دقیقه بیش از 2 جستجو انجام دهد. با استفاده از Code-Behind، فقط باید یک صفحه aspx را بررسی کنیم، سپس درخواست جستجو را رد یا اجازه دهیم.

آیا تا به حال سعی کرده اید یک پلاگین، ماژول یا یک صفحه پویا برای سیستم های دات نت ایجاد کنید؟
آیا تاکنون یک سیستم دات نت ساخته اید که از افزونه، ماژول یا افزونه صفحه پویا پشتیبانی کند؟
آیا تا به حال به این فکر کرده اید که چرا این فرآیند در دات نت اینقدر دشوار است!

در آینده سعی خواهیم کرد مقاله ای در مورد نقد ساختار کنترلر و مدل پیش فرض ASP.NET Core تهیه کنیم.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا