更新已更改的对象值

时间:2019-03-18 08:05:55

标签: c# asp.net asp.net-mvc

我目前有以下情况:

我的应用程序中有一个配置文件部分,用户可以在其中更新其配置文件数据。因此,我有一个mvc表单,用户可以在其中添加其他信息或修改其数据。在我的表单提交功能中,我收到的用户对象大部分已填写但未完全填写(某些值是null,因为我使用的是身份服务,并且我不希望用户更改密码哈希)。 / p>

现在这是我的问题:

如何在不编写类似以下内容的情况下更新我的用户对象:(profileData.User是提交的用户)

var user = await _userManager.FindByIdAsync(profileData.User.Id);
user.Email = profileData.User.Email;
user.Salutation = profileData.User.Salutation;
user.FirstName = profileData.User.FirstName;
user.LastName = profileData.User.LastName;
...
var result = await _userManager.UpdateAsync(user);

我显然不能使用它,因为这将覆盖未在提交的用户中设置的所有字段:

var user = profileData.User

是否可以在不覆盖所有字段的情况下更新用户对象?

1 个答案:

答案 0 :(得分:0)

使用DTO的一个很好的理由是,每个get / update函数对都可以有一个不同的DTO。与其拥有一个“包罗万象”的更新功能,不如拥有一个可以更新您可以在每种表格中更改的属性的功能。是的,您最终将获得许多类和函数,但是您也将得到易于测试的单次使用函数,这些函数可以很好地完成一项工作(并且不会遇到您要问的那种问题)。

var user = await _userManager.FindByIdAsync(profileData.User.Id);
user.Email = profileData.User.Email;
user.Salutation = profileData.User.Salutation;
user.FirstName = profileData.User.FirstName;
user.LastName = profileData.User.LastName;

var result = await _userManager.UpdateProfileAsync(user); <-- Only updates the 'profile' fields

我也将采取某种方式争论FindByIdAsync不应返回密码/盐等。也许您应该具有函数FindProfileByIdAsync