Blazor 具有扩展功能的EditForm,无需编写html部分

Blazor 具有扩展功能的EditForm,无需编写html部分,blazor,Blazor,我希望有EditForm,当存在未保存的更改时,它会通知我 使用EditContext和EditContext.OnFieldChangedevent handler()可以轻松完成: @(isUnsavedChangePresent?“未保存更改!”:“已保存更改”) 省省吧 (状态在焦点更改后更新) @代码{ 私有编辑上下文编辑上下文; 产品=新产品(); 布尔不存在; 私有异步void EditContext\u onfildChanged(对象?发送方,FieldChangedEve

我希望有
EditForm
,当存在未保存的更改时,它会通知我

使用
EditContext
EditContext.OnFieldChanged
event handler()可以轻松完成:


@(isUnsavedChangePresent?“未保存更改!”:“已保存更改”)
省省吧
(状态在焦点更改后更新)
@代码{
私有编辑上下文编辑上下文;
产品=新产品();
布尔不存在;
私有异步void EditContext\u onfildChanged(对象?发送方,FieldChangedEventArgs e)
{
isUnsavedChangePresent=真;
}
类产品
{
公共字符串名称{get;set;}
}
受保护的覆盖无效OnParametersSet()
{
editContext=新的editContext(产品);
editContext.OnFieldChanged+=editContext\u OnFieldChanged;
}
}
我希望将此
EditForm
作为自己的组件,因此我尝试了以下方法:

@使用Microsoft.AspNetCore.Components.Forms
@继承EditForm
@ChildContent(EditContext)@*是否正确??它抛出有关级联参数的错误*@
@代码
{
受保护的重写异步任务OnParametersSetAsync()
{
this.EditContext=新的EditContext(this.Model);
EditContext.OnFieldChanged+=EditContext\u OnFieldChanged;
}
私有异步void EditContext\u onfildChanged(对象?发送方,FieldChangedEventArgs e)
{
Console.WriteLine(“在文件中更改”);
}
}

我想使用父级
EditForm
中的HTML部分,但我不知道如何或是否可能使用。

下面的代码描述了如何定义从EditForm组件派生的泛型类

ExtendedEditForm.cs(将其放在Pages文件夹中)
不,不正确。ChildContent属性继承自EditForm,派生类不会重写呈现EditForm的BuildRenderTree方法,而是在其呈现过程中使用ChildContent。你什么都不做。。。这方面没有代码。请注意,重写BuildRenderTree方法可以通过两种方式完成:在代码中,通过重写BuildRenderTree或通过创建组件的视图部分(Razor标记和C#)(.Razor)

我建议您编写自己的组件
@Danielrera谢谢,这是一个很好的解决方案,比我希望的要干净得多。(你能把你的评论变成答案吗?)这正是我想要的。非常感谢。也谢谢你的注释和解释。我唯一没有完全理解的是
IsSaved
vs
isunsavedchangempresent
。因为它们不是完全的。初始化时,
IsSaved
将为false,但不存在任何更改(因此无需通知用户)。更改后应通知,但
已保存
相同。这就是为什么我认为
OnFieldChanged
是必要的。IsSaved是我给isUnsavedChangePresent的简称。好的,我理解你想要达到的目标。将代码更改为:IsSaved?“”:“未保存更改!”并使用默认值true定义IsSaved属性。现在,当您的应用程序第一次运行时,IsSaved为true,因此不会显示任何消息。在EditContext\u OnFieldChanged方法中添加:IsSaved=false;这会导致在用户开始编辑时显示消息“更改未保存!”。最后,当用户单击“提交”按钮时,IsSaved设置为true,导致消息消失。。。
public partial class ExtendedEditForm <T> : EditForm
    {
        [Parameter]
        public T MyModel { get; set; }

        protected override void OnInitialized()
        {
            EditContext = new EditContext(MyModel);
            EditContext.OnFieldChanged += EditContext_OnFieldChanged;
           
            base.OnInitialized();
        }


        private void EditContext_OnFieldChanged(object sender, FieldChangedEventArgs e)
        {
            Console.WriteLine(e.FieldIdentifier.FieldName);

        }
    }
@page "/"

<ExtendedEditForm MyModel="product" OnValidSubmit ="OnValidSubmit">
    <span>@(IsSaved ? "changes are saved" : "changes are not saved!" )</span>
    <InputText @bind-Value="product.Name" />
    <button type="submit">Save it </button>
    <div>(state is updated after focus change)</div>
</ExtendedEditForm>
    
@code {
       
    Product product = new Product();

    private bool IsSaved { get; set; }

    private void OnValidSubmit()
    {
        IsSaved = true;
    }

    public class Product
    {
        public string Name { get; set; }
    }
}
@ChildContent(EditContext) @*is this correct?? It throws error about cascading parameters*@