我的一个剃刀组件库出现问题。
我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
不含类。
我想念什么吗?我只是不明白为什么它不起作用:/
如果您在建设者中致电:
[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);
}
它是从ComponentBase派生的,忘记了我的帖子,对不起,我会读它。那么我应该初始化ClassMapper OnInitialized / OnInitializedAsync吗?我会试试看 :)
OnInitialized
因为您没有调用异步代码。得到它现在的工作......通过增加
ClassMapper.Add(InlineClass)
内OnInitialized
非常感谢你!