Blazor:未设置 Razor 组件继承的基本 class 参数

Blazor: Razor component inherited parameter of base class not set

我的一个剃须刀组件库出现问题。

我的组件有一个抽象基础 class RazorHtmlComponent,参数 属性 [Parameter] public string InlineClass { get; set; } 将用于 css classes 映射到实际组件。然后我有另一个基础 class 每个组件包含组件特定的属性,它是这样定义的: abstract class BaseRazorButton: RazorHtmlComponent

我的组件,在此示例中 RazorButton.razor 继承自抽象按钮基础 class BaseRazorButton

问题是,当我实例化剃须刀按钮并将 属性 InlineClass 设置为任何值时,它在我的实际 RazorButton 实例中保持为空。

为了更好地理解,这里有一个最小的代码示例:

基础class:

public abstract class RazorHtmlComponent : ComponentBase, IRazorHtmlComponent
{
  [Parameter] public string InlineClass { get; set; }

  public DomDefinitionMapper ClassMapper { get; }

  ...

  protected RazorHtmlComponent()
  {
    ClassMapper = new DomDefinitionMapper(InlineClass);
  }

Dom 定义映射器:

  public class DomDefinitionMapper
  {
    public List<Func<string>> DefinitionRepository { get; } = new List<Func<string>>();

    public DomDefinitionMapper(string definition = "")
    {
      if (!string.IsNullOrEmpty(definition))
      {
        DefinitionRepository.Add(() => definition);
      }
    }

    public string GetDefinitions(char separator = default)
      => separator.Equals(default) ? 
          string.Join(" ", DefinitionRepository.Select(i => i()).Where(i => i != null)) 
        : string.Join($" {separator}", DefinitionRepository.Select(i => i()).Where(i => i != null));
  }

按钮底座class:

public abstract class BaseRazorButton: RazorHtmlComponent
{
  ...
}

Razor 按钮组件:

@inherits BaseRazorButton

<button class="@ClassMapper.GetDefinitions()">
  @Text
</button>

Razor 按钮的实例化:

<RazorButton InlineClass="page" 
             Text="1"/>

当我在浏览器中检查时,未设置使用 InlineClass 参数定义的 class "page"。在调试模式下,ClassMapper DefinitionRepository 不包含 class。

我错过了什么吗?我只是不明白为什么它不起作用:/

如果您在构造函数中调用它:

[Parameter] public string InlineClass { get; set; }
...
protected RazorHtmlComponent()
{
    ClassMapper = new DomDefinitionMapper(InlineClass);
}

参数尚未设置。它将在 OnInitializedOnInitializedAsync 被调用时出现。
而你的 RazorHtmlComponent 必须来自 ComponentBase

public abstract class RazorHtmlComponent : ComponentBase, IRazorHtmlComponent
{
  [Parameter] public string InlineClass { get; set; }

  public DomDefinitionMapper ClassMapper { get; }

  ...

  protected override void OnInitialized()
  {
    ClassMapper = new DomDefinitionMapper(InlineClass);
  }