【问题标题】:Post uneditable values发布不可编辑的值
【发布时间】:2012-12-12 16:50:15
【问题描述】:

我有一个视图和一个模型(比如 Car)。表单中的一个字段是可编辑的(仅显示其他信息)。当视图表单发布时,我需要所有信息,而不仅仅是可编辑属性。但是所有其他属性都是空的。

我曾经创建隐藏字段来发布数据,但是当你的隐藏字段比非隐藏字段多时,它会产生非常脏的代码。

有没有办法在不使用隐藏字段的情况下发布模型的所有属性?

【问题讨论】:

  • 是什么让您认为隐藏字段未被占用?
  • 看来您必须使用 ViewModel 模式并接受 CarViewMode 实例(只有必需/可编辑的字段)而不是 Car。你可以将 CarViewModel 映射到 Car 对象。更多信息在这里:msdn.microsoft.com/en-us/…
  • 将不可编辑的字段传递给客户端并返回不是这样做的方法。它效率低下(传输所有数据只是为了让您的生活更轻松)和安全风险(好奇的用户更改值您没想到会改变)。在服务器上管理合并要好得多。
  • @SimonHalsey 如果服务器端编码良好,则没有安全风险:例如,如果您没有使用来自客户端的所有值更新实体,但您有一个服务只更新允许更新的内容(editable property by editable property),没有问题。
  • @ken2k 你是对的,但我认为如果我们往返所有数据以保存重新加载它,我们可能不会检查我们正在保存的字段。

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


【解决方案1】:

您应该只使用带有可编辑字段的 ViewModel。 在视图中,只需将模型的 id 作为隐藏字段放在数据库中。

在您的控制器中,从数据库中获取模型。然后检查您是否确实可以修改此项目(例如,有人可以使用 Firebug 更改隐藏字段中的 id)。

然后,只需使用 ViewModel 中的字段更新数据库模型...并再次将模型保存到数据库。

如果您在视图中使用您的 CAR 模型,有人可能会更改比您允许的更多的字段...如果您使用 CarViewModel,这是不可能的,因为模型绑定器只会绑定视图模型的属性。

【讨论】:

  • +1 表示“通过 id 从 DB 获取模型,仅更新允许的内容,保存到 DB”
  • 我也认为这是正确的方法...使用带有可编辑字段+模型主键的ViewModel,并添加@Html.HiddenFor(model => model.Id)查看,并使用ViewModel更新db...
【解决方案2】:

以 html 形式发布的数据是输入的内容。如果您在帖子中需要这些数据,我认为隐藏字段没有问题,这就是隐藏字段的用途。

话虽如此,如果您真的想减少隐藏字段的数量,您可以在一个字段中“序列化”所有这些信息,然后在帖子中“反序列化”它。或者在自定义模型绑定器中。

但是如果你想要在 Asp.Net MVC 中开箱即用的 ModelBinder 的魔力,你必须使用表单域。

【讨论】:

    【解决方案3】:

    如果您反对将信息张贴在隐藏字段中,另一种选择是将它们包含在查询字符串中。

    【讨论】:

    • 使用查询字符串可能比使用隐藏字段还要糟糕。至少对于隐藏字段,用户看不到您传递的内容
    猜你喜欢
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    相关资源
    最近更新 更多