در مباحث اعتبارسنجی و احراز هویت Blazor در قسمتهای بعدی، به قطعه کد context@ داری در داخل یک RenderFragment خواهیم رسید:
<AuthorizeView> <Authorized> Hello, @context.User.Identity.Name! </Authorized> </AuthorizeView>
برای پاسخ به این سؤال نیاز است با مفهوم «Templated components» در برنامههای Blazor آشنا شد. تا اینجا از RenderFragmentها صرفا جهت فراهم آوردن قسمت ثابتی از قالب کامپوننت جاری، توسط استفاده کنندهی از آن، کمک گرفتیم. اما در همان سمت استفاده کننده، امکان دسترسی به اطلاعات مهیای داخل آن فرگمنت نیز وجود دارد. برای نمونه به کدهای کامپوننت TableTemplate.razor دقت کنید:
@typeparam Titem <table class="table"> <thead> <tr>@TableHeader</tr> </thead> <tbody> @foreach (var item in Items) { <tr>@RowTemplate(item)</tr> } </tbody> </table> @code { [Parameter] public RenderFragment TableHeader { get; set; } [Parameter] public RenderFragment<TItem> RowTemplate { get; set; } [Parameter] public IReadOnlyList<TItem> Items { get; set; } }
- همچنین یک RenderFragment جنریک را نیز مشاهده میکنید که قالب ردیفهای جدول را تامین میکند. نوع جنریک قابل دسترسی در این کامپوننت، توسط دایرکتیو typeparam Titem@ تعریف شدهی در ابتدای آن، مشخص شدهاست.
- بنابراین هربار که ردیفی از بدنهی جدول در حال رندر است، یک شیء item از نوع TItem را به قالب سفارشی تامین شدهی توسط بکارگیرندهی خود ارسال میکند.
اکنون این سؤال مطرح میشود که چگونه میتوان به شیء item، در سمت والد یا بکارگیرندهی کامپوننت TableTemplate فوق دسترسی یافت؟
برای اینکار میتوان از پارامتر ویژهای به نام context که یک implicit parameter است و به صورت پیشفرض تعریف شده و مهیا است، در سمت کدهای بکارگیرندهی کامپوننت، استفاده کرد:
@page "/pets" <h1>Pets</h1> <TableTemplate Items="pets"> <TableHeader> <th>ID</th> <th>Name</th> </TableHeader> <RowTemplate> <td>@context.PetId</td> <td>@context.Name</td> </RowTemplate> </TableTemplate> @code { private List<Pet> pets = new() { new Pet { PetId = 2, Name = "Mr. Bigglesworth" }, new Pet { PetId = 4, Name = "Salem Saberhagen" }, new Pet { PetId = 7, Name = "K-9" } }; private class Pet { public int PetId { get; set; } public string Name { get; set; } } }
- همچنین در اینجا پارامتر ویژهای به نام context@ را نیز مشاهده میکنید. این پارامتر همان شیء item ای است که در حین رندر هر ردیف جدول، به فرگمنت RowTemplate ارسال میشود. به این ترتیب کامپوننت والد میتواند از اطلاعات در حال رندر توسط کامپوننت فرگمنت دار، مطلع شود و از آن استفاده کند. در این مثال، نوع context@، از نوع کلاس Pet است که سعی شده بر اساس نوع پارامتر Items ارسالی به آن، توسط کامپایلر تشخیص داده شود. حتی میتوان این نوع را به صورت صریحی نیز مشخص کرد:
<TableTemplate Items="pets" TItem="Pet">
<SomeGenericComponent TParam1="Person" TParam2="Supplier" TItem=etc/>
<TableTemplate Items="pets" Context="pet"> <TableHeader> <th>ID</th> <th>Name</th> </TableHeader> <RowTemplate> <td>@pet.PetId</td> <td>@pet.Name</td> </RowTemplate> </TableTemplate>
<TableTemplate Items="pets"> <TableHeader> <th>ID</th> <th>Name</th> </TableHeader> <RowTemplate Context="pet"> <td>@pet.PetId</td> <td>@pet.Name</td> </RowTemplate> </TableTemplate>