Blazor: компонент Razor, унаследованный от базового класса, не установлен - PullRequest
1 голос
/ 17 февраля 2020

У меня проблема с одной из моих библиотек компонентов бритвы.

У меня есть абстрактный базовый класс RazorHtmlComponent для моих компонентов со свойством параметра [Parameter] public string InlineClass { get; set; }, которое должно использоваться для css классов, которые должны быть сопоставлены с фактическим компонентом. Затем у меня есть другой базовый класс для каждого компонента, содержащий свойства компонента c, которые определяются следующим образом: 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);
  }

Mapper определения 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
{
  ...
}

Компонент кнопки Razor:

@inherits BaseRazorButton

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

Использование кнопки Razor:

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

Когда я проверяю внутри в просмотре, класс "страница", определенный внутри с использованием InlineClass параметр не установлен. В режиме отладки ClassMapper DefinitionRepository не содержит класс.

Я что-то упустил? Я просто не понимаю, почему это не работает: /

1 Ответ

1 голос
/ 17 февраля 2020

Если вы позвоните в construtor:

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