【问题标题】:Is there a way to change the model on a Blazor EditForm Component depending on user selection?有没有办法根据用户选择更改 Blazor EditForm 组件上的模型?
【发布时间】:2021-05-09 09:24:22
【问题描述】:

我有一个名为 Client 的类和两个继承自它的类 ClientCompany 和 ClientPerson,我有一个 blazor EditForm 来添加编辑客户端并根据用户选择的客户端类型(公司或人员)我想绑定窗体和控件对应的类及其属性。

我想在同一个表单上执行此操作,因为父类 Client 有很多字段,但 ClientCompany 和 ClientPerson 只有少数,所以如果我为每个类创建两个不同的 blazor 组件,我会重复代码。

所以我想知道是否有办法根据单选按钮选择更改 EditForm 及其控件的绑定模型,所以如果用户选择 Person 将 EditForm 绑定到 ClientPerson 但如果用户选择 Company 则绑定 EditForm给客户公司。

我正在使用 .net 5、Blazor Web 程序集和实体框架。

【问题讨论】:

    标签: inheritance blazor


    【解决方案1】:
    <EditForm EditContext="@EditContext" OnValidSubmit="HandleValidSubmit">
    
    </EditForm>
    
    @code
    {
        private EditContext EditContext;
        private Client client= new Client() { };
    
        protected override void OnInitialized()
        {
            EditContext = new EditContext(client);
    
            base.OnInitialized();
        }
    }
    

    如您所见,您最初可以使用 Client 类的实例初始化 EditContext 对象,当您的用户做出选择时,您可以使用新的 EditContext 实例初始化 EditContext 实例,如下所示:

    ClientCompany client= new ClientCompany () { };
    
    EditContext = new EditContext(client);
    

    【讨论】:

    • 感谢 Enet 的帮助,我非常感谢。我尝试应用您的建议,但是当我想访问 ValidSubmit 上的模型属性时,它们为空。我想这与我绑定控件的方式有关,我正在做的就是这个。 code protected void HandleValidSubmit() { ClientCompany clientC = EditContext.Model as ClienteCompany; EditContext.Model 上的所有属性都为空。谢谢
    • 当然它们是空的...你希望它们是什么?如果您将值输入到 EditForm 的控件中,然后使用新的 ClientCompany 创建 EditContext 对象的新实例,则先前输入的数据将丢失。在重置 EditContext 的值之前,您应该调用 HandleValidSubmit 方法。实际上,您可以将 EditContext 对象的重置放在 HandleValidSubmit 方法中,以防止用户再次单击“提交”按钮,该操作可能会导致将相同数据添加到数据库的不必要尝试。
    • 对不起,Enet,我不明白。 The first time the form is empty and the EditContext object is Client, then the user selects ClientCompany or ClientPerson, when the selection happens I change de EditContext to ClientCompany or ClientPerson, then the user fills the controls with data, then he clicks on save data在 HandleValidSubmit 上我拿了数据,我想保存它。但是当我尝试访问数据时,一切都是空的。
    • 发布完整的代码仓库。不要错过任何东西......
    • 嗨 Enet,我发现了问题,这是在用户做出选择的事件上,ClientCompany client= new ClientCompany () { }; EditContext = new EditContext(client);,这是创建一个局部变量客户端并且没有绑定到控件,所以我使用这而不是client= new ClientCompany (),并且绑定有效。非常感谢您的帮助。
    猜你喜欢
    • 2011-07-25
    • 1970-01-01
    • 2019-09-24
    • 2016-06-27
    • 1970-01-01
    • 2021-10-01
    • 2017-07-31
    • 2021-09-25
    相关资源
    最近更新 更多