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);
}
参数尚未设置。它将在 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);
}
我的一个剃须刀组件库出现问题。
我的组件有一个抽象基础 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);
}
参数尚未设置。它将在 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);
}