如何在Blazor中阻止变量持久性



我有一个类似的简单页面

<table>
<thead>
<tr>
<th>Id</th>
<th>Name</th>
<th>Age</th>
</tr>
<thead>
<tbody>
@foreach(user in Users)
{
<tr>
<th>@user.Id</th>
<th>@user.Name</th>
<th>@user.Age</th>
<th><button type="button" @onclick="() => EditUser(user)">Edit</button></th>
</tr>
}
</tbody>
</table>
@code
{
var Users = GetUsers(); // Fetch a list of users
private void EditUser(User user)
{
var selectedUser = user;
selectedUser.Name = "Changed";
}
}

当我的var selectedUser获取userData时,它会在列表中的user上持久存在,我的意思是当selectedUser.Name设置为"时;更改";列表中的用户也会更改,但我不想这样做,直到用户单击保存按钮。那么,如何获取所有的用户数据,但在更改时不持久。按照保存按钮的例子,我的想法是在保存之后,我使用linq或index从列表中获取用户,并在那里设置对象。

一种方法:安装AutoMapper

注意,我通常会将Mapper设置为一个注入的服务。

private void EditUser(User user)
{
var config = new MapperConfiguration(cfg => cfg.CreateMap<User, User>());
var mapper = new Mapper(config);
var selectedUser = new User();
mapper.Map<User, User>(user, selectedUser);
selectedUser.Name = "Changed";
}

当我的var selectedUser获取userData时,它将在列表中的用户上持久存在。

这是因为var selectedUser = user;使selectedUser成为对同一类的引用。

或者,如果可以修改User类,则可以使用受保护的MemberwiseClone函数制作该类的浅层副本。

最新更新