You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor中实现可取消的双向绑定内联编辑方案咨询

Blazor内联编辑取消修改的解决方案

Blazor没有内置的双向绑定撤销机制,你需要在编辑开始时手动保存原数据的副本,点击取消时用副本恢复原对象的状态。

具体实现步骤:

  • 新增变量存储编辑前的原始数据副本
  • 进入编辑模式时,创建当前行数据的深拷贝(避免引用关联导致副本同步修改)
  • 点击取消时,用副本覆盖原数据的属性值,退出编辑模式
  • 点击保存时,保留修改(或提交到数据库),退出编辑模式

修改后的完整代码如下:

@page "/inlineeditingsample"

<PageTitle>Inline Editing Sample</PageTitle>

<h1>Inline Editing Sample</h1>

@if (_items == null)
{
    <p><em>Loading...</em></p>
}
else
{
    <table class="table">
        <thead>
            <tr>
                <th>ID</th>
                <th>Title</th>
                <th>Description</th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in _items)
            {
                var link = $"TableSampleDetails/{@item.ID}";
                <tr>
                    @if (item == _editItem)
                    {
                        <td>
                        @item.ID
                        </td>
                        <td><input type="text" class="form-control" @bind="@item.Title"/></td>
                        <td><input type="text" class="form-control" @bind="@item.Description" /></td>
                        <td>
                            <button type="button" class="btn btn-link" @onclick="() => Cancel(item)">Cancel</button>
                            <button type="button" class="btn btn-link" @onclick="() => Save(item)">Save</button>
                        </td>
                    }
                    else
                    {
                        <td>
                            <NavLink href="@link">@item.ID</NavLink>
                        </td>
                        <td>@item.Title</td>
                        <td>@item.Description</td>
                        <td>
                            <button type="button" class="btn btn-link" @onclick="() => Edit(item)">Edit</button>
                            <button type="button" class="btn btn-link" @onclick="() => Delete(item)">Delete</button>
                        </td>
                    }
                </tr>
            }
        </tbody>
    </table>
}

@code {
    private DAL.SampleObject? _editItem;
    private DAL.SampleObject? _originalItem; // 新增:存储原始数据副本
    private List<DAL.SampleObject> _items;

    private DAL.SampleDal _dal = new DAL.SampleDal();

    private void Edit(DAL.SampleObject item)
    {
        _editItem = item;
        // 创建深拷贝,这里用Json序列化方式,需要确保SampleObject可序列化
        var json = System.Text.Json.JsonSerializer.Serialize(item);
        _originalItem = System.Text.Json.JsonSerializer.Deserialize<DAL.SampleObject>(json);
        // 如果SampleObject是简单类,也可以手动复制属性:
        // _originalItem = new DAL.SampleObject { ID = item.ID, Title = item.Title, Description = item.Description };
    }

    private void Save(DAL.SampleObject item)
    {
        _editItem = null;
        _originalItem = null;

        // 调用仓储更新数据
        // 完成后显示提示
    }

    private void Delete(DAL.SampleObject item)
    {
        _editItem = null;
        _originalItem = null;

        // 调用仓储删除数据
        // 完成后显示提示
        _items.Remove(item);
    }

    private void Cancel(DAL.SampleObject item)
    {
        if (_originalItem != null)
        {
            // 用原始副本覆盖当前数据
            item.Title = _originalItem.Title;
            item.Description = _originalItem.Description;
        }
        _editItem = null;
        _originalItem = null;
    }

    protected override async Task OnInitializedAsync()
    {
        var items = await _dal.ListObjectsAsync(0, int.MaxValue);
        _items = items.ToList();
    }
}

说明:

  • 深拷贝的方式:如果SampleObject是简单的POCO类,手动复制属性更高效;如果类结构复杂,用Json序列化反序列化是通用的深拷贝方法(需要确保类可序列化,没有循环引用)。
  • 这样修改后,编辑时输入框的修改只会作用于原对象,但点击取消时会恢复到编辑前的状态,不会影响原数据的持久化版本,直到点击保存才提交修改。

内容的提问来源于stack exchange,提问作者Jeremy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 06:45:35