Aspnetcore: Erreur de construction lorsque le paramètre et le composant enfant ont le même nom

Créé le 7 nov. 2018  ·  3Commentaires  ·  Source: dotnet/aspnetcore

Ajouter le support pour @tagHelperPrefix

Problème

L'implémentation actuelle de Blazor v0.6.0 ne prend pas en charge Razor @tagHelperPrefix

Impact fonctionnel

Essayer d'inclure un composant enfant dans un RenderFragment d'un composant parent où l'enfant et le RenderFragment ont le même nom entraînera une erreur de compilation.

Étapes de repro minimales

Supposons que nous ayons un composant dans Panel.cshtml comme suit:

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

et un autre composant dans PanelHeader.cshtml comme ceci:

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

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

puis l'utilisation de ces deux composants dans une page comme le code ci-dessous entraînera une erreur de compilation:

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

Proposition

Je recommanderais d'ajouter la prise en charge de @tagHelperPrefix afin de simplifier la distinction des composants de RenderFragments.

Le code ci-dessus peut alors être réécrit comme suit:

Panel.cshtml ressemblerait à ceci:

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

Et PanelHeader.cshtml ressemblerait à ceci:

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

Et enfin, les composants enfant et parent peuvent être utilisés comme ceci:

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

Tous les 3 commentaires

Merci pour cette suggestion!

Nous ne prévoyons pas d'ajouter la prise en charge de @tagHelperPrefix car l'intention est que les composants et les paramètres suivent les mêmes règles de résolution de nom que les types et propriétés .NET. Par exemple, si vous devez qualifier un espace de noms pour un nom de composant, vous devez simplement spécifier l'espace de noms en plus du nom de type: <Namespace.MyComponent /> . Cela n'est pas encore implémenté, mais est suivi par https://github.com/aspnet/Blazor/issues/1315.

Cela dit, votre scénario devrait fonctionner tel quel aujourd'hui, et le fait que ce ne soit pas le cas, je pense, est un bogue. C'est l'équivalent d'avoir une propriété et un type avec le même nom, ce qui devrait convenir.

Oh ce sera génial mais en même temps serait très long à taper dans tous les espaces de noms. Peut-être, une fois implémenté, vous pouvez ajouter une fonctionnalité pour fournir quelque chose comme l'instruction using en C #

@fayezmm Oui , la bonne nouvelle est que Razor a déjà une directive @using pour cela.

Cette page vous a été utile?
0 / 5 - 0 notes