【问题标题】:How to update just selected field in the passed ViewModel如何在传递的 ViewModel 中更新刚刚选择的字段
【发布时间】:2021-11-16 06:14:18
【问题描述】:

我有一个视图模型来更新数据(来自 API,而不是视图),参数如下:

public string Name { get; set; }
public string Email { get; set; }
public string Phone { get; set; }

我只想更新“名称”,所以我的参数如下:

{
  "name": "my name"
}

它的名字变成了“我的名字”,但它的电子邮件和电话变成了空。如果输入表单中不存在参数,如何避免参数更改为空? 谢谢...

【问题讨论】:

  • 隐藏输入框?
  • 能否请您也添加您的查看代码!
  • string 是引用类型,默认取空值。当您想要更新值时,您应该检查它是否不为空或为空。使用 string.IsNullOrWhiteSpace(str)

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


【解决方案1】:

您必须调整更新的任何内容,以便它理解“null 表示不设置值,而不是将值设置为 null”

例如,如果您正在运行数据库更新查询,您可以:

UPDATE person
SET 
  name = COALESCE(@name, name),
  email = COALESCE(@email, email),
  phone = COALESCE(@phone, phone)
WHERE 
  id = @id

现在,如果任何值作为 null 提供,更新会将列设置为与当前相同的值(即无操作)

如果你正在调整一个 c# 对象,你可以采取类似的方法:

 var p = db.FindPerson(viewmodel.PersonId);

 p.Name = viewmodel.Name ?? p.Name;
 ...
    

【讨论】:

    【解决方案2】:

    如我所见,您的软件设计存在问题或误解。

    如果此 API 端点仅用于更新名称字段,那么您的 ViewModel 中不应包含其他字段。但是,如果您在某些情况下更新其他字段,那么您也应该传递它们的值。

    因此,您可能需要首先调用 Get 端点以在客户端“例如网页”中获取所需的所有数据,然后允许该客户端重新发送完整的 JSON,而不仅仅是名称。 或者您可能只需要一个仅使用名称的端点。

    如果您使用的是 EF,另一种解决方案是在更新 EF 实体时忽略空字段。 例如

    ...
    var entity = dbContext.Employees.FirstOrDefault(e => e.Id == 3);
    entity.Name = request.Name;
    await dbContext.SaveChangesAsync();
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多