我正在尝试使用 Blazor InputBase 和 EditForm 组件创建可重用的表单。(我省略了与模型绑定相关的大部分代码,但想法是组件接收模型,并从属性中确定字段并生成输入字段)
到目前为止,我有以下组件
<EditForm Model="@Model"
OnInvalidSubmit="OnInvalidSubmit"
OnValidSubmit="OnInvalidSubmit">
@CustomRender
</EditForm>
@code {
[Parameter] public TModel Model { get; set; }
[Parameter] public EventCallback OnValidSubmit { get; set; }
[Parameter] public EventCallback OnInvalidSubmit { get; set; }
public RenderFragment CustomRender { get; set; }
public RenderFragment CreateComponent() => builder =>
{
base.BuildRenderTree(builder);
builder.OpenElement(0, "nav");
builder.AddAttribute(1, "class", "menu");
builder.AddAttribute(2, "value", "Hello");
builder.CloseElement();
builder.OpenComponent(3, typeof(InputText)); // here's the problem
// builder.AddAttribute(4, "@bind-Value", "myValue");
builder.CloseComponent();
};
protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
RenderComponent();
}
protected void RenderComponent()
{
CustomRender = CreateComponent();
}
让我解释一下这个想法,我应该像这样从其他任何地方调用这个组件(例如作为一个 nuget 包)
<Tabla Model="@MyModel"></Tabla>
我的问题是,我应该使用我在此处描述的结构(EditForm、InputBase 等)还是应该使用纯 HTML元素,例如Form、input type="text" "number"并手动创建它们?
检查以下行
builder.OpenComponent(3, typeof(InputText))
这条线应该打开一个 Blazor InputText (我认为),但由于缺少像“bind-Value”这样的属性,这不起作用。再次不必担心模型绑定(我已经通过反射获得了道具),我的问题是这些从 InputBase 继承的组件的实例化)。