تعریف Render Section با استفاده از Razor

چهارشنبه 29 مهر 1394

با استفاده از متد RenderBody، کل محتوای View درخواستی در موقعیت تعریف شده آن در فایل Layout، رندر می‌شود. این ویژگی به نحو یکسانی به تمام Viewها اعمال می‌شود. اما اگر نیاز باشد تا view بتواند محتوای markup قسمت ویژه‌ای از master page را مقدار دهی کند، می‌توان از مفهومی به نام Sections استفاده کرد. به تازگی به دلیل رخداد Web.Exception(که در متن در مورد آن صحبت خواهد شد) استفاده از متد RenderSection افزایش یافته است. ابتدا لازم است با این قابلیت مهم آشنا شویم.

تعریف  Render Section با استفاده از Razor

RenderSection متدی از System.Web.WebPages namespace و WebPageBaseclass است و بر دو نوع می باشد، به عبارت دیگر دو متد مشابه اما با پارامترهای متفاوت هستند. که به صورت زیر می باشند:

RenderSection(string): این متد فقط محتوای section(بخش) نام گذاری شده در صفحات layout را ارائه (render) می کند. و به صورت ساده می تواند تعریف شود.

RenderSection(string, Boolean): این متد بخش نام گذاری شده را مانند متد قبلی دارد، اما همچنین مشخص می کند که آیا این بخش مورد نیاز است یا خیر. این متد با یک پارامتر اضافی کار کوچک ولی ارزشمندی را انجام می دهد که در زیر در مورد آن بحث خواهیم کرد.

 چرا این متد مورد نیاز است؟

در اینجا یک روش بهتر برای درک این مطلب وجود دارد که آن را با مثالهای زیر توضیح داده ایم.

فرض کنید که ما یک برنامه را طراحی کرده ایم که سه صفحه دارد. و شامل صفحات "Home"، "About" و "Topics" می باشد و تمام صفحات محتوای متفاوتی دارند.

در حال حاضر ما یک نوار کناری(sidebar) روی تمام سه صفحه داریم و محتوای Home و About از Admin مشابه هستند و صفحه Topic محتوایی دارند که شامل نمایش تمام تگ ها برای مقالات/موضوعات هستند.

در حال حاضر این سه صفحه از layout مشابه هستند و یک sidebar  که باید در مکان مشابه برای صفحات نمایش داده شود نیز وجود دارد. در layout.cshtml(C# Razor)، در هر کجا که ما نیاز به بخش sidebar داشته باشیم باید ابتدا RenderSection@ را بنویسیم.

و در صفحات انفرادی که از Layout در آن استفاده شده، ما یک بخشی به صورت زیر داریم:

@RenderSection("Section Name").

  در هر کجا هر آنچه محتویات که ممکن است آن را تعریف کنیم  را یک بار روی Layout تعریف کرده ایم. این کار نوشتن کدهای HTML و CSS را ساده می سازد.

این کار تا زمانی که شما فقط سه صفحه داشته باشید، بسیار ساده است،. فکر می کنید که این همیشه ممکن است؟نه . در برنامه کاربردی تحت وب، ممکن است تعدادی صفحه وجود داشته باشد که از layout استفاده می کنند. اینجا جایی است که یک نکته مهم در مورد Render Section وجود دارد که باید قبل از استفاده آن در ذهن داشته باشیم.

هر صفحه ای که از Layout  و layout.cshtml با ()RenderSection استفاده می کنیم که یک بخش دارد که با نام تعریف شده است. با پر نکردن پارامتر دوم کاربر ممکن است به خطا برخورد کند، یا  یک صفحه خالی که تمام بخش های صفحه هنوز ارائه نشده اند را ببیند. یک استثنای((Exception رخ داده شده در اینجا می باشدSystem.Web.Exception

System.Web.Exception :(علت رخداد، تعریف نکردن "SECTION NAME" در متد می باشد). بنابراین، بهتر است از روش دوم استفاده شود، به عبارت دیگر از  RenderSection(string, Boolean) استفاده شود. اگر ما از RenderSection("SECTION NAME", required:false) استفاده کنیم، این بدان معنی است که اگر یک بخش که مورد نیاز است و در صفحه تعریف نشده باشد، خطا رخ نمی دهد و این بخش در برخی از صفحات اختیاری است، پس با استفاده از این روش، متد () RenderSection چیزی را render نمی کند و به همین دلیل خطای زمان اجرا نیز رخ نمی دهد.

اگر ما از RenderSection("SECTION NAME", required:true)، استفاده کنیم پس نیاز داریم که حتما section را در تمام صفحاتی که برای هر layout تعریف شده قرار دهیم. ما می توانیم یک section خالی تعریف کنیم تا از رخداد خطای زمان اجرا جلوگیری کنیم.

استفاده از شرط برای حضور یک section در صفحه:

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

@if(IsSectionDefined("SECTION NAME")) {    
   @RenderSection("SECTION NAME")    
}    
else {    
.....//Goes on    
}

در نمونه ضمیمه شده به این مقاله، نحوه استفاده از متد RenderSection نشان داده شده است.

 

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

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید