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

次に、以下のコードのようなページでこれら2つのコンポーネントを使用すると、コンパイル時エラーが発生します。

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

提案

コンポーネントとRenderFragmentsを簡単に区別できるように、 @tagHelperPrefixサポートを追加することをお勧めします。

上記のコードは、次のように書き直すことができます。

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件

この提案をありがとう!

コンポーネントとパラメーターが.NETのタイプとプロパティと同じ名前解決ルールに従うことを目的としているため、 @tagHelperPrefixサポートを追加する予定はありません。 たとえば、コンポーネント名を名前空間で修飾する必要がある場合は、タイプ名に加えて名前空間を指定するだけです: <Namespace.MyComponent /> 。 これはまだ実装されていませんが、 https://github.com/aspnet/Blazor/issues/1315によって追跡されてい

そうは言っても、あなたのシナリオは今日そのままで機能するはずであり、そうでないという事実はバグだと思います。 これは、同じ名前のプロパティとタイプを持つことと同じですが、これで問題ありません。

ああ、それは素晴らしいことですが、同時に、すべての名前空間を入力するのに非常に時間がかかります。 おそらく、実装すると、C#でusingステートメントのようなものを提供する機能を追加できます。

@fayezmmうん、良いニュースは、Razorがすでに@usingディレクティブを持っていることです。

このページは役に立ちましたか?
0 / 5 - 0 評価