Section های انتخابی در Razor با محتوای پیش فرض

در این مقاله قصد داریم کار با Section در Razor را آموزش داده و امکاناتی که Razor در اختیار ما قرار می دهد را در رابطه با سکشن ها آموزش دهیم .

Section های انتخابی در Razor با محتوای پیش فرض

در Asp.net MVC با کمک Razor  این امکان وجود دارد که صفحات را مانند قطعاتی جدا در صفحه Layout  به کمک Section ها در کنار هم قرار داده و به عنوان یک صفحه واحد رندر کرده و به کاربر نمایش داد.کار به این شکل انجام می شود که در صفحه Layout نام این قطعات در نقاط دلخواه ذکر می شود و بعد این قطعات (section) در صفحات فرزند تعریف می شوند.متدی که این کار را در RenderSection() نام دارد.به عنوان نمونه صفحه view زیر را که از یک صفحه Layout ارث بری کرده است را ببینید.



@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_LayoutPage.cshtml";
}

<h2>صفحه Index</h2>
@section ExtraContent{
    <h5>این محتوا از داخل صفحه فرزند(Index view) در این جا آورده می شود</h5>
    }

 

در این صفحه یک section به نامExtraContentluvtd معرفی شده است.در صفحه _layout هم برای رندر کردن این Section از دستور @RenderSection  استفاده می کنیم .کد صفحه _layout  به شکل زیر می باشد.

        @RenderBody()
                    <p>@RenderSection("ExtraContent")</p>
                    @if (IsSectionDefined("OptionalContent"))
                    {
                        @RenderSection("OptionalContent")
                    }
                    else
                    {
                        <div>این محتوای پیش فرض است و در صورتی که سکشن مورد نظر در مستر پیج در صفحه فرزند تعریف نشده باشد در این جا نمایش داده می شود. </div>
                    }

Extracontent باید در صفحه پیرو تعریف شود زیرا دستور Required =False را برای آن ننویشته ایم .و اگر این sectionدر view ایی تعریف نشود به خطا بر خواهیم خورد.

اما در دستور زیر که در صفحه _layout خود نوشته ایم :

@RenderSection("OptionalContent1", required: false)

اگر این section که نام آنOptionalContent  است در view فرزندی تعریف نشود اشکالی ندارد و به خطا برنخواهیم خورد .پس با این دستور الزامی به پیاده سازی این section نداریم.

Option های مختلفی برای رندر کردن سکشن در صفحه Layout وجود دارد:

Option1: استفاده از متد IsSectionDefined

این متد true یا  false برمی گرداند .اگر در داخل صفحه فرزند section ایی که در داخل این متد نوشته می شود تعریف شده باشد True و در غیر این صورت False بر می گرداند.

توجه کنید اگر از @  قبل از renderSectionاستفاده نکنیدبرنامه خطای زیر را خواهد داد

The following sections have been defined but have not been rendered for the layout page "~/Views/Shared/_Layout.cshtml": "OptionalContent"

Option2: استفاده از inline templates

Razor امکانی برای ارسال template به صورت یک function در اختیار ما قرار می دهد.

using System.Web.WebPages;
using System;
 
public static class SectionExtensions {
    private static readonly object _o = new object();
    public static HelperResult RenderSection(this WebPageBase page,
                        string sectionName,
                        Func<object, HelperResult> defaultContent) {
        if (page.IsSectionDefined(sectionName)) {
            return page.RenderSection(sectionName);
        }
        else {
            return defaultContent(_o);
        }
    }
}

با این کد اگر section مورد نظر که در اینجا SectionName است تعریف نشده باشد میتوانیم یک page پیش فرض را به جای آن نمایش دهیم .

فایل های ضمیمه