Aspnetcore: Erstellungsfehler, wenn Parameter und untergeordnete Komponente denselben Namen haben

Erstellt am 7. Nov. 2018  ·  3Kommentare  ·  Quelle: dotnet/aspnetcore

Unterstützung für @tagHelperPrefix

Problem

Die aktuelle Implementierung von Blazor v0.6.0 unterstützt Razor @tagHelperPrefix

Funktionale Auswirkungen

Der Versuch, eine untergeordnete Komponente in ein untergeordnete als auch das

Minimale Reproschritte

Nehmen wir an, wir haben eine Komponente in Panel.cshtml wie folgt:

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

und eine andere Komponente in PanelHeader.cshtml wie folgt:

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

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

Die Verwendung dieser beiden Komponenten auf einer Seite wie dem folgenden Code führt zu einem Fehler bei der Kompilierung:

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

Vorschlag

Ich würde empfehlen, Unterstützung für @tagHelperPrefix hinzuzufügen, um die Unterscheidung von Komponenten von RenderFragments zu vereinfachen.

Der obige Code kann dann wie folgt umgeschrieben werden:

Panel.cshtml wäre wie folgt:

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

Und PanelHeader.cshtml würde so aussehen:

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

Und schließlich können sowohl die untergeordnete als auch die übergeordnete Komponente folgendermaßen verwendet werden:

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

Alle 3 Kommentare

Danke für diesen Vorschlag!

Wir planen nicht, Unterstützung für @tagHelperPrefix hinzuzufügen, da Komponenten und Parameter denselben Regeln für die Namensauflösung wie .NET-Typen und -Eigenschaften folgen sollen. Wenn Sie beispielsweise einen Komponentennamen für den Namespace qualifizieren müssen, geben Sie einfach den Namespace zusätzlich zum Typnamen an: <Namespace.MyComponent /> . Dies ist noch nicht implementiert, wird jedoch von https://github.com/aspnet/Blazor/issues/1315 verfolgt.

Das heißt, Ihr Szenario sollte heute so funktionieren, wie es ist, und die Tatsache, dass es meiner Meinung nach nicht funktioniert, ist ein Fehler. Dies entspricht einer Eigenschaft und einem Typ mit demselben Namen, was in Ordnung sein sollte.

Oh, das wird großartig, aber gleichzeitig wäre es sehr langwierig, alle Namespaces einzugeben. Wenn Sie implementiert sind, können Sie möglicherweise eine Funktion hinzufügen, um eine Anweisung wie using in C # bereitzustellen.

@fayezmm Yup , die gute Nachricht ist, dass Razor bereits eine @using Direktive dafür hat.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen