در نوشته های پیشین درباره فایل های نما، لایه ها و برخی از عبارت های Razor گفتگو کردیم و اکنون در این نوشته می خواهیم درباره عبارت های تکرار for@ و foreach@ و while@ و do while@ بگوییم. همانگونه که می بینید همگی این ها عبارت های سی شارپ هستند که در موتور Razor برای به کارگیری در فایل های نما به کار می روند.

آماده سازی داده ها

به طور معمول داده ها را از جدول های پایگاه داده رابطه ای بدست می اوریم ولی چون هنوز وارد ترکیب Entity Framework و هم کنشی (تعامل) به پایگاه داده از درون ASP.NET Core نشده ایم، پس در اینجا یک کلاس به نام User را می نویسیم که بر پایه کد زیر دارای یک سری از ویژگی ها است. برای این در پوشه اصلی پروژه یک فایل تازه با پسوند cs بسازید و کدهای زیر را برای شناساندن (تعریف کردن) کلاس User در آنها بنویسید.

اکنون نیاز است تا یک کلاس کنترل گر به نام UserController را بسازیم، از این رو درون پوشه Controllers یک فایل cs تازه ساخته و کدهای زیر را در آن وارد کنید. کلاس کنترل گر ما UserController است که از کلاس پایه Controller ارث بری می کند. از این رو چون کلاس Controller در فضای نام Microsoft.AspNetCore.Mvc است، پس باید این فضای نام نیز در آغاز فایل UserController.cs پیوست شود.

در کلاس UserController یک متد به نام ()Index را نوشته ایم. توجه کنید متد ()Index صفحه خانگی هر کنترل گر را اداره می کند، از این رو برای فراخوانی این متد از کلاس UserController می توانیم یکی از دو نشانی https://localhost:5001/user یا https://localhost:5001/user/index را از مرورگر به  بفرستیم. درون متد ()Index یک لیست از نمونه های کلاس User ساخته شده است، سپس این لیست که users نام دارد را در غالب ViewBag.UsersList به فایل نما فرستاده ایم.

کد زیر چگونگی ساخت لیستی از نمونه های کلاس User را نشان می دهد. لیست ها گونه ای Collection ها هستند که می توانند نمونه هایی از یک گونه مانند Int یا string یا نمونه هایی از کلاس های پیش فرض Net Core یا کلاس های نوشته شده بدست برنامه نویس را در خود نگه دارند و سپس می توان به کمک حلقه های تکرار، روی عناصر درون آنها پیمایش کرد. List ها و در کل Collection ها در فضای نام System.Collections.Generic قرار دارد.

بنابراین در اینجا فایل UserController.cs نیاز به ضمیمه کردن دو فضای نام زیر دارد:

System.Collections.Generic

Microsoft.AspNetCore.Mvc

فایل نما و عبارت foreach@

می خواهیم فایل هایی را برای کنترل گر UserController بسازیم، پس باید یک پوشه به نام User در زیر پوشه Views بسازیم. در اینجا چون متد ما ()Index نام دارد، پس یک فایل به نام Index.cshtml در مسیر Views/User می سازیم. کدهای زیذر محتوای این فایل را نشان می دهد که در آنها نخست بدنه یک جدول HTML با تگ <table> نوشته شده است. چون کلاس ما ۵ ویژگی داشت و ما می خواهیم به ازای هر ویژگی یک ستون داشته باشیم، پس نخست درون tr نخستین، ۵ تگ td را نوشته ایم. سپس یک عبارت Razor به نام forearch@ را فراخوانی کرده ایم و سپس درون آکولادهای باز و بسته آن تگ های td دیگری را درون دومین tr نوشته ایم.

کد زیر از خط ۱۵ فایل Index.cshtml عبارت foreach@ را نشان می دهد که این حلقه به اندازه عنصرهای درون لیست ViewBag.UsersList@ انجام می شود. در هر بار انجام شدن حلقه، متغیر user یکی از سطرهای لیست ViewBag.UsersList@ را در خود دارد و سپس در هر کدام از تگ های td مقدار یکی از ۵ ویژگی کلاس User نشان داده می شود. همانگونه که می بینید بازهم آغاز user.Id یک کاراکتر @ به گونه user.Id@ نوشته شده است.

توجه کنید که در آغاز فایل Index.cshtml دستور زیر نوشته شده است بدین مفهوم که عنوان یا Title برگه وب را در خود فایل نما نوشته ایم و چون پیش فرض فایل لایه Layout.cshtml_ به فایل نما پیوست می شود، پس مقدار [“ViewData[“Title@ نیز در جای خودش و در میان تگ <title> نوشته می شود. همچنین در نوشته پیشین و به کمک ()RenderSection یک بخش به نام main را شناساندیم (تعریف کردیم) که اکنون به کمک دستور section main@ همه کدهای HTML و عبارت های Razor در فایل نما در میان آکولادهای باز و بسته آن نوشته شده اند.

عبارت for@ و ویژگی Count

در خط ۷ از کد زیر، به کمک ویژگی Count از ViewBag، شمارِ (تعداد) آیتم های درون لیست ViewBag.UsersList@ را بدست آورده و سپس در میان تگ های <p> و <b> نشان داده ایم. توجه کنید برای به کارگیری متد Count در فایل نما دیگر پایان آن پرانتزهای باز و بسته را ننوشته ایم.

اکنون در کد زیر می خواهیم به کمک عبارت for@ عنصرهای درون لیست را فهرست کنیم و این تکرار تا زمانی انجام می شود که آیتمی درون لیست باشد و برای این نیاز است تا بازهم اندازه لیست را بدانیم و از این رو در عبارت for@ زیر می بینید که تکرار تا زمانی انجام می شود که i کمتر از شمار عنصرهای لیست یعنی ViewBag.Users.List.Count@ باشد.

اکنون و در خط ۱۹ نیاز داریم تا آیتم کنونی با مقدار کنونی اندیس i که یک نمونه از کلاس User است را داشته باشیم، پس به کمک دستور زیر آیتم کنونی را در متغیری به نام user نگهداری کرده و سپس در میان تگ های td مقدار هر یک از ویژگی های آن را نشان می دهیم.

عبارت while@ و تعریف متیغرها در فایل نما

در دستورهای زیر چگونگی تعریف متغیرها در میانه فایل های نما به شما نشان داده شده است. برای تعریف متغیرها در فایل نما باید تعریف متغیر میان {}@ نوشته شود. توجه کنید که بازهم نیاز است تا پایان آن یک کاراکتر سمی کالن ; نوشته شود. در کدهای زیر من یکبار متغیر i را با int و بار دیگر با var تعریف کرده ام. همچنین در سومین دستور چندین متغیر شناسانده شده اند.

اکنون در فایل زیر و به کمک عبارت while@ هر یک از عناصر درون لیست را نشان می دهیم. عبارت while@ باید تا زمانی انجام شود که اندیس i کمتر از شمار آیتم های درون لیست باشد که بازهم نیاز به متد Count برای پیدا کردن اندازه آیتم های لیست داریم که این در شرط درون عبارت، i < @ViewBag.UsersList.Count آورده شده است. در پایان یکی به مقدار i به کمک دستور ++i افزوده می شود.

عبارت do … while@

در پایان عبارت do … while می ماند که در زیر نوشته شده است. همه چیز همانند عبارت while@ است ولی اینکه در پایان دستور while که پس از بسته شده آکولاد می آید، یک کاراکتر سمی کالن ; نیز باید نوشته شود.

کد زیر همه محتوای فایل Index.cshtml را با عبارت do … while@ نشان می دهد.