【发布时间】:2023-04-09 18:57:01
【问题描述】:
基本上我正在尝试创建Templated Component 和layout 的组合。 我想要一个可以重复使用的页面布局,并且仍然将 required 参数传递给。我认为一种方法可能是利用抽象基类。
如果我想通过渲染树构建来完成这一切,这可以通过我的第三个选项来解决,但我不想这样做。我可以接受由渲染树构建的基础(即选项 3),但不是从它继承的组件(即MyGrid.razor)
我想做什么:
MyGrid.razor
@page "/mygrid"
@inherits GridPage @*or "layout" or whatever works*@
<Grid>
<Column>
<Column>
</Grid>
@code {
protected overrides string Title => "My Grid"
}
GridPage.cs
<header>@Title</header>
<div>@ChildContent</div>
@code {
[Parameter] public string Title { get; set; }
[Parameter] public RenderFragment ChildContent { get; set; }
}
我尝试过的解决方案
- 布局
GridLayout
<header>@Title</header>
<div>@Body</div>
@code {
[CascadingParameter]
[Parameter] public string Title { get; set; }
}
问题是你必须记住这个参数是可用的,它不需要隐含
- 模板
<GridPageTemplate Title="My Title">
<Grid>
<Column>
<Column>
</Grid>
</GridPageTemplate>
问题是我必须用模板包装我的组件(没什么大不了的,但宁愿继承),我仍然不知道需要哪些参数来实现。
- 抽象基类
public abstract class GridPage : ComponentBase
{
protected abstract string Title { get; }
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
builder.OpenRegion(0);
builder.OpenElement(1, "header");
builder.AddContent(2, Title);
builder.CloseElement();
builder.CloseRegion();
builder.OpenElement(3, "div")
builder.OpenRegion(10);
this.BuildRenderTree(builder);
builder.CloseRegion();
builder.Closelement()
}
}
问题是这个似乎不起作用。我实际上认为这会导致它只接收组件并继续基础渲染 (this.BuildRenderTree(builder);)。
期望的结果
假设您有两个网格.. Students 网格和 Classes 网格。我希望它们每个都有不同的网格(和标题)。我想基本上为每个自定义标题和列。它们会有一个共同的布局标记(我称之为GridPage),但MyGrid(Students 或Classes)会有所不同。
Students.razor
@page "/students"
@inherits GridPage
<Grid RowType=Student>
<Column For="StudentName">
<Column For="StudentAge">
<Column For="StudentHomeRoom">
</Grid>
@code {
protected overrides string Title => "Students"
}
Classes.razor
@page "/classes"
@inherits GridPage
<Grid RowType=Class>
<Column For="ClassName">
<Column For="ClassTime">
</Grid>
@code {
protected overrides string Title => "Classes"
}
他们都会输出
<header>Title_here</header>
<div>Grid_markup_here</div>
【问题讨论】: