Aspnetcore: 参数和子组件具有相同名称时生成错误

创建于 2018-11-07  ·  3评论  ·  资料来源: dotnet/aspnetcore

添加对@tagHelperPrefix

问题

Blazor v0.6.0的当前实现不支持Razor @tagHelperPrefix

功能影响

尝试在子组件和RenderFragment具有相同名称的父组件的RenderFragment中包含子组件会导致编译时错误。

最少的复制步骤

让我们假设我们在Panel.cshtml有一个组件,如下所示:

<div class="panel panel-default">
  <div class="panel-heading">@PanelHeader</div>
  <div class="panel-body">@PanelBody</div>
</div>

@functions{
  [Parameter] private RenderFragment PanelHeader { get; set; }
  [Parameter] private RenderFragment PanelBody { get; set; }
}

以及PanelHeader.cshtml另一个组件,如下所示:

<div>@Title</div>
<div>@SubTitle</div>

@functions{
  [Parameter] private string Title { get; set; }
  [Parameter] private string SubTitle { get; set; }
}

然后在类似以下代码的页面中使用这两个组件将导致编译时错误:

<Panel>
  <PanelHeader>
       <PanelHeader Title="some title" SubTitle="sub title"></PanelHeader>
  </PanelHeader>
  <PanelBody>Some content ...</PanelBody>
<Panel>

提议

我建议添加对@tagHelperPrefix支持,以便简化与RenderFragments区别的组件。

上面的代码然后可以按如下方式重写:

Panel.cshtml像这样:

<strong i="32">@tagHelperPrefix</strong> "pre1:"
<div class="panel panel-default">
  <div  class="panel-heading">@PanelHeader</div>
  <div  class="panel-body">@PanelBody</div>
</div>

@functions{
  [Parameter] private RenderFragment PanelHeader { get; set; }
  [Parameter] private RenderFragment PanelBody { get; set; }
}

PanelHeader.cshtml看起来像这样:

<strong i="37">@tagHelperPrefix</strong> "pre2:"
<div>@Title</div>
<div>@SubTitle</div>

@functions{
  [Parameter] private string Title { get; set; }
  [Parameter] private string SubTitle { get; set; }
}

最后,子组件和父组件都可以像这样使用:

<pre1:Panel>
  <PanelHeader>
       <pre2:PanelHeader Title="some title" SubTitle="sub title"></pre2:PanelHeader>
  </PanelHeader>
  <PanelBody>Some content ...</PanelBody>
<pre1:Panel>
area-blazor bug

所有3条评论

感谢您的建议!

我们不打算增加对@tagHelperPrefix支持,因为其目的是使组件和参数遵循与.NET类型和属性相同的名称解析规则。 例如,如果您需要使用名称空间来限定组件名称,则除了类型名称之外,只需指定名称空间: <Namespace.MyComponent /> 。 尚未实现,但已通过https://github.com/aspnet/Blazor/issues/1315进行了跟踪

就是说,您的方案今天应该可以正常工作,而事实并非如此,我认为这是一个错误。 这等效于具有相同名称的属性和类型,这应该没问题。

哦,那太好了,但同时输入所有名称空间的时间也很长。 也许在实现后,您可以添加功能以在C#中提供类似using语句的功能

@fayezmm是的,好消息是Razor已经@using指令。

此页面是否有帮助?
0 / 5 - 0 等级