温馨提示:本文翻译自stackoverflow.com,查看原文请点击:c# - Blazor: Razor component inherited parameter of base class not set
asp.net-mvc blazor c# razor razor-components

c# - Blazor:未设置基类的Razor组件继承参数

发布于 2020-05-05 08:59:31

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

RazorHtmlComponent为我的组件提供了一个带有参数属性的抽象基类,该属性[Parameter] public string InlineClass { get; set; }应用于将css类映射到实际组件。然后,每个组件都有另一个基类,其中包含组件特定的属性,其定义如下:abstract class BaseRazorButton: RazorHtmlComponent

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

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

这是一个最小的代码示例,可以帮助您更好地理解:

基类:

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

按钮基类:

public abstract class BaseRazorButton: RazorHtmlComponent
{
  ...
}

剃刀按钮组件:

@inherits BaseRazorButton

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

剃刀按钮的实例化:

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

当我在浏览器中检查时,InlineClass未设置使用参数定义的类“页面” 在调试模式下, ClassMapper DefinitionRepository不含类。

我想念什么吗?我只是不明白为什么它不起作用:/

查看更多

提问者
epanalepsis
被浏览
10
agua from mars 2020-02-17 18:52

如果您在建设者中致电:

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

该参数尚未设置。它将在何时OnInitialized或被OnInitializedAsync调用。
而你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);
  }