【问题标题】:Partial Properties Binding/Posting in ASP.NET Core 2.1 MVCASP.NET Core 2.1 MVC 中的部分属性绑定/发布
【发布时间】:2019-09-15 10:04:25
【问题描述】:

我有一个具有 10 个属性的模型。此信息存储在具有 10 个字段的数据库表中。假设每个属性都与表格列匹配。

我有一个使用这个模型的视图。此视图仅使用 10 个属性中的 4 个属性。用户将仅编辑这 4 个属性。当我把它发回来。我只获取这 4 个属性的值,因为这些是绑定到视图的唯一字段。所有其他属性为空。我没有使用任何 HTML 隐藏标签来绑定其他属性。因此,[HttpPost] ControllerAction 中的其他属性为空。

我的问题是,

有没有一种简单的方法可以从这 10 个属性中识别出哪些 4 个属性绑定到视图,而这些是我需要在数据库中更新的唯一属性。

换句话说,“ModelState”是否知道 View 中绑定了哪些属性? 要么 是否有其他类可以准确地告诉我哪些字段绑定到该“视图”,以便我可以编写代码来仅更新数据库中的那些字段。

【问题讨论】:

  • 创建一个“编辑模型”类,您可以在其中选择要保存到数据库的任何属性
  • 我想过这样做。如果我有四个不同的视图更新四组不同的属性(3、3、2、2),那么我最终会得到 4 个额外的“编辑模型”类,这是我想避免的。我只想使用一个模型,并且仍然在不同的视图中巧妙地处理它。
  • 这就是要走的路,它可能看起来很多,但它比一个大魔术课要好。它只是变成了汤

标签: c# asp.net-mvc model-view-controller model-binding asp.net-core-2.1


【解决方案1】:

您可以尝试不同的方法来做到这一点:

当您从视图发布这 4 个属性以更新模型时,请使用模型的标识符字段从数据库中获取数据。从数据库返回的这个模型将包含所有 10 个字段的信息,您可以将 4 个字段更新到这个模型中。然后将这个更新后的模型传给数据库进行更新操作。

类似这样的:

public void Post(MyViewModel inputModel)
{
    var id = inputModel.Id;
    var dbModel = GetById(id);
    dbModel.Field1 = inputModel.Field1;
    dbModel.Field2 = inputModel.Field2;
    dbModel.Field3 = inputModel.Field3;
    dbModel.Field4 = inputModel.Field4;

    UpdateModelInDB(dbModel);
}

【讨论】:

  • 这正是我已经实现的。但是想象一下,关注每个字段名称可能会变得乏味。出于某种原因,如果从视图中删除了一个字段,那么我们应该记住将其从操作中删除。我正在使用 Form.Keys 和 C# 反射来传输操作中的属性值。我想知道是否还有其他优雅的解决方案。
猜你喜欢
  • 2020-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多