【问题标题】:Blazor Custom Bind - Get Property of model that changedBlazor 自定义绑定 - 获取已更改模型的属性
【发布时间】:2021-03-24 21:22:27
【问题描述】:

我从 SQL Server 接收数据并将其加载到模型中:

namespace BlazorServer.Models
{
    public class Animal
    {
        public int height { get; set; }

        public string name { get; set; }

        public string origin { get; set; }
    }
}

在一个组件中,我使用模型来显示数据。用户可以编辑数据。这是一个示例:

<input @onchange="args => ValueChanged(args)" value="@animal.name" class="form-control form-control-sm border rounded" />

如何获取模型的哪个属性发生了变化?我尝试了以下方法,但我只得到了新值:

private void ValueChanged(ChangeEventArgs args)
{
    var newValue = args.Value;
}

我想更新组件中的模型(相当于blazor的绑定)AND也马上将数据发送到SQL服务器。

【问题讨论】:

    标签: c# blazor


    【解决方案1】:

    Blazor 附带 EditForm,它管理 EditContext,以及一组输入控件 - 在您的情况下为 InputText - 与 EditContext 接口。您可以访问EditContext,在OnFieldChanged 上注册事件处理程序并获取更改事件。您会收到一个FieldIdentifier,您可以使用它来识别哪个字段已更改。

    见 - MS Documentation

    这是一个简单的剃​​须刀页面,使用EditContextOnFieldChanged 进行演示

    @page "/Test"
    
    @implements IDisposable
    
    <EditForm EditContext="this.editContext" class="m-3">
        Animal: <InputText @bind-Value="this.model.name"></InputText><br />
        Origin: <InputText @bind-Value="this.model.origin"></InputText><br />
    </EditForm>
    
    <div class="m-3">FieldChanged:<i>@this.FieldChanged</i> </div>
    
    
    @code {
    
        public class Animal
        {
            public int height { get; set; }
            public string name { get; set; }
            public string origin { get; set; }
        }
    
        private Animal model = new Animal() { height = 2, name = "giraffe", origin = "Africa" };
    
        private EditContext editContext;
    
        private string FieldChanged = "none";
    
        protected override Task OnInitializedAsync()
        {
            this.editContext = new EditContext(model);
            this.editContext.OnFieldChanged += this.OnFieldChanged;
            return base.OnInitializedAsync();
        }
    
        private void OnFieldChanged(object sender, FieldChangedEventArgs e)
        {
            var x = e.FieldIdentifier;
            this.FieldChanged = e.FieldIdentifier.FieldName;
    
        }
    
        // Need to  Implement IDisosable to unhook event handler
        public void Dispose ()
        {
            this.editContext.OnFieldChanged -= OnFieldChanged;
        }
    }
    

    【讨论】:

    • 这按预期工作。剩下一个问题:如何获取已更改字段的旧值/新值?
    • 这取决于旧值的含义。开箱即用控件的问题是您只能看到新值和最后一个值。通过多次编辑,您会丢失原始值我个人使用我编写的一个名为 EditStateControl 的控件来跟踪原始值的更改。在我的个人 GitHub 网站上有信息 - shauncurtis.github.io/articles/EditFormState.html。如果你想使用它,请提起/复制代码。
    • 最后一个值和新值将适合我的需要。我的模型有多个属性(名称、原点、高度)。如何获取在 OnFieldChanged 事件中更改的属性的最新值和新值?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    相关资源
    最近更新 更多