0

我正在尝试使用 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元素,例如Forminput type="text" "number"并手动创建它们?

检查以下行

 builder.OpenComponent(3, typeof(InputText))

这条线应该打开一个 Blazor InputText (我认为),但由于缺少像“bind-Value”这样的属性,这不起作用。再次不必担心模型绑定(我已经通过反射获得了道具),我的问题是这些从 InputBase 继承的组件的实例化)。

4

0 回答 0