@context 是什么?为什么它是红色的?

saf*_*ter 10 c# blazor

我在 blazor 服务器端应用程序中使用 BlazoredTypeahead 组件,我想知道 @context 关键字来自哪里。

以下代码运行正常,但 VS 报告它无法解析符号“上下文”。当然,我很好奇它为什么有效以及上下文来自哪里。

@inject IEquipmentService EquipmentService
@inject AppDataService AppDataService
<h3>ModelSelect</h3>

<BlazoredTypeahead SearchMethod="SearchModels"
                   @bind-Value="equipModel">
    <SelectedTemplate>
        @context.model
    </SelectedTemplate>
    <ResultTemplate>
        @context.model (@context.model_desc)
    </ResultTemplate>
</BlazoredTypeahead>

@if (equipModel != null)
{
    <p>Selected model is: @equipModel.model</p>
}

@code {


    private EquipModel equipModel;


    private async Task<IEnumerable<EquipModel>> SearchModels(string searchText)
    {
        var result = await EquipmentService.SearchModels(AppDataService.CurrentContact, searchText);

        return await Task.FromResult(result.ToList());
    }


}
Run Code Online (Sandbox Code Playgroud)

Isa*_*aac 10

当您在组件中定义 RenderFragment 属性时,您实际上定义了一个委托,该委托封装了具有 T 类型的单个参数的方法,例如:

RenderFragment<TItem> RowTemplate
Run Code Online (Sandbox Code Playgroud)

当您像这样执行委托时:

@foreach (var item in Items)
 {
     <tr>@RowTemplate(item)</tr>
 }
Run Code Online (Sandbox Code Playgroud)

您为项目列表中的每个项目调用委托,向委托传递一个项目对象,例如 Pet 对象(请注意,此处委托的类型说明符是通用的。@context是 Blazor 提供的内部变量,其中包含传递给委托的值,例如:

<RowTemplate>
  <td>@context.ID</td>
  <td>@context.Name</td>
</RowTemplate>  
Run Code Online (Sandbox Code Playgroud)

注意:RowTemplate 元素的开头和结尾内的内容表示由 RowTemplate RenderFragment 委托生成的内容片段...再次生成内容时,您将获取传递给委托的值并使用它。如果该值是 Pet 对象,例如具有两个字段,则可以使用 @context.Name 等表达式访问字段的值。

请注意,有一种方法可以使用传递的对象的类型名称而不是使用 @context,但这是另一个故事了。

但 VS 报告它无法解析符号“上下文”

这是一个警告,对吧?我没有检查你的代码,但在我看来,使用的类型说明符是泛型类型,而 VS 无法解析底层类型。在我的示例中,类型说明符是 TItem,但传递给属性的项目列表的类型RenderFragment<TItem> RowTemplate 是 Pet 类型。

据我记得,以前泛型类型存在问题,您必须将基础类型传递给模板化组件...您必须像这样编写代码:

模板化组件的使用:

RenderFragment<TItem> RowTemplate
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我们分配了一个名为"pets"Items 属性的 Pet 对象列表,但我们还必须指定在列表 ( ) 中传递的对象的类型TItem="Pet"。据我所知这个问题已经解决了,也许 BlazoredTypeahead 的代码是以前写过的?