Aspnetcore: Error de compilación cuando el parámetro y el componente secundario tienen el mismo nombre

Creado en 7 nov. 2018  ·  3Comentarios  ·  Fuente: dotnet/aspnetcore

Agregar soporte para @tagHelperPrefix

Problema

La implementación actual de Blazor v0.6.0 no es compatible con Razor @tagHelperPrefix

Impacto funcional

Intentar incluir un componente secundario dentro de un RenderFragment de un componente principal donde tanto el secundario como el RenderFragment tienen el mismo nombre resultará en un error de tiempo de compilación.

Pasos mínimos de reproducción

Supongamos que tenemos un componente en Panel.cshtml como sigue:

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

y otro componente en PanelHeader.cshtml como este:

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

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

luego, el uso de estos dos componentes en una página como el siguiente código dará como resultado un error de tiempo de compilación:

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

Propuesta

Recomendaría agregar soporte para @tagHelperPrefix para simplificar la distinción de componentes de RenderFragments.

El código anterior se puede volver a escribir de la siguiente manera:

Panel.cshtml sería así:

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

Y PanelHeader.cshtml se vería así:

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

Y finalmente, tanto el componente secundario como el principal se pueden usar así:

<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 comentarios

¡Gracias por esta sugerencia!

No planeamos agregar soporte para @tagHelperPrefix porque la intención es que los componentes y parámetros sigan las mismas reglas de resolución de nombres que los tipos y propiedades de .NET. Por ejemplo, si necesita calificar el espacio de nombres de un nombre de componente, simplemente debe especificar el espacio de nombres además del nombre de tipo: <Namespace.MyComponent /> . Esto aún no se ha implementado, pero https://github.com/aspnet/Blazor/issues/1315 lo rastrea

Dicho esto, su escenario debería funcionar hoy como está, y el hecho de que no lo haga, creo que es un error. Es el equivalente a tener una propiedad y un tipo con el mismo nombre, lo que debería estar bien.

Oh, eso será genial, pero al mismo tiempo sería muy largo escribir todos los espacios de nombres. Quizás, cuando se implemente, puede agregar una función para proporcionar algo como using declaración en C #

@fayezmm Sí, la buena noticia es que Razor ya tiene una directiva @using para eso.

¿Fue útil esta página
0 / 5 - 0 calificaciones