Aspnetcore: Erro de compilação quando o parâmetro e o componente filho têm o mesmo nome

Criado em 7 nov. 2018  ·  3Comentários  ·  Fonte: dotnet/aspnetcore

Adicionar suporte para @tagHelperPrefix

Problema

A implementação atual do Blazor v0.6.0 não tem suporte para Razor @tagHelperPrefix

Impacto funcional

Tentar incluir um componente filho dentro de um RenderFragment de um componente pai onde o filho e o RenderFragment têm o mesmo nome resultará em erro de tempo de compilação.

Etapas de reprodução mínimas

Vamos supor que temos um componente em Panel.cshtml como segue:

<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; }
}

e outro componente em PanelHeader.cshtml como este:

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

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

então, usar esses dois componentes em uma página como o código abaixo resultará em um erro de tempo de compilação:

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

Proposta

Eu recomendaria adicionar suporte para @tagHelperPrefix para simplificar a distinção de componentes de RenderFragments.

O código acima pode então ser reescrito da seguinte forma:

Panel.cshtml seria assim:

<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; }
}

E PanelHeader.cshtml ficaria assim:

<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; }
}

E, finalmente, os componentes filho e pai podem ser usados ​​assim:

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

Todos 3 comentários

Obrigado por esta sugestão!

Não planejamos adicionar suporte para @tagHelperPrefix porque a intenção é que os componentes e parâmetros sigam as mesmas regras de resolução de nome que os tipos e propriedades .NET. Por exemplo, se você precisar qualificar o namespace de um nome de componente, basta especificar o namespace além de digitar o nome: <Namespace.MyComponent /> . Isso ainda não foi implementado, mas é monitorado por https://github.com/aspnet/Blazor/issues/1315.

Dito isso, seu cenário deve funcionar hoje como está, e o fato de não funcionar é um bug. É o equivalente a ter uma propriedade e tipo com o mesmo nome, o que não deve ser problema.

Oh, isso seria ótimo, mas ao mesmo tempo seria muito demorado para digitar todos os namespaces. Talvez, quando implementado, você pode adicionar um recurso para fornecer algo como using instrução em C #

@fayezmm Sim, a boa notícia é que o Razor já tem uma diretiva @using para isso.

Esta página foi útil?
0 / 5 - 0 avaliações