MVC编辑存储在隐藏字段中的复杂对象

fej*_*oco 5 javascript c# asp.net-mvc datagrid model-binding

假设我有一个包含列表的非常庞大的模型,甚至那些列表也可以包含包含其他列表的对象.我想在没有AJAX的MVC4(或5)中创建一个编辑表单.

所以我认为第一部分是在隐藏字段中将整个对象存储在客户端.列表绑定就像魅力一样,请参阅http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/.现在完整的往返工作正常,我可以将整个对象推送到绑定隐藏字段中的客户端,它会在提交时返回给我,并将发布的隐藏字段放入复杂对象,嵌套列表和包含的所有内容中.

列表或其他对象应根据某些操作进行编辑.一种情况是单个对象或列表项显示为不可编辑,当用户单击它时,它就地可编辑,因此例如网格中的单元格成为文本框.另一种情况是根本不显示单个对象或列表项,当用户单击按钮时,会出现一个带有文本输入字段的弹出窗口.

是否有图书馆或经证实的方法可以做到这一点?

fej*_*oco 0

非常巨大的模型是一种业务需求,它必须作为一个实体进行编辑,最好在一页上,它非常有意义,但我不能谈论它。我最初认为(或希望)有一个易于描述的解决方案,但显然,这在 MVC 中并不常见。这与 AJAX 有很大不同,它有优点也有缺点。可以肯定的是,它的使用更广泛,因此记录也更多。没有AJAX,只有一次往返,虽然有点大,但用户体验更流畅。无论如何,这里有一个粗略的指南,说明如何按照我要求的方式进行操作。

正如我在问题中所说,客户端-服务器往返由 MVC 处理(大部分)带有隐藏字段。稍后可以通过在 JSON 中编码一些内容而不是隐藏字段来对其进行优化,它不会影响系统的其余部分。

普通字段存储在普通编辑器中,而不是隐藏字段。从客户端-服务器往返的角度来看,这没有什么区别。所以这些可以就地编辑。

网格渲染也很容易。在这种情况下,服务器端 MVC 网格并不是最优的,因为它们会向客户端发送冗余数据。幸运的是,还有更多的客户端网格解决方案,它们本质上是独立于服务器平台的。只需从隐藏字段中收集所需的数据,并在页面加载时使用 JavaScript 网格库从中构建网格即可。当然,正如我所说,列表可以包含大量数据和其他嵌套列表,但在这个简单的网格中,必须选择一些必要的列,这没有问题。

现在是有趣的部分,如何编辑包含所有复杂数据的网格行。假设我的模型中有一个人员列表,他们有一个地址列表。有一个人员网格,当您单击一行时,您希望最终用户能够编辑人员及其地址的附加数据。

首先,需要提前将Person编辑器模板发送到客户端。我们需要将该编辑器模板放入我们的视图中,并将其隐藏。每当用户想要编辑一个人时,我们都会创建一个包含该编辑器模板内容的 JS 对话框。

我们需要将 Person 编辑器模板绑定到存储在隐藏字段中的 Person 对象。根据用户单击的行,我们获得一个索引,然后绑定Model.Persons[index]到该模板。Knockout.js 是 JS 绑定的一个很好的候选者。它来回执行所有字段复制。

MVC 编辑器模板还可以包含验证逻辑。在这种情况下没有问题,因为我们将编辑器模板作为一个整体渲染到客户端。验证将在弹出窗口内进行,无需任何魔法。当用户按下保存按钮时,验证将运行,当验证成功时,我们使用绑定引擎将弹出内容复制回隐藏字段。

这不是最简单的事情,但是非常简单。实际上,需要几个不同的JS库,并不像我希望的那样。因此,如果有人想在不使用 AJAX 的情况下在单个页面上编辑复杂的模型,那当然是可能的。它仍然没有完整记录,因为我无法分享更多细节。但它有其优点:只需一次往返,因此用户体验更快,并且无需在服务器上维护状态,所有数据在一次往返中检索并保存为一个实体。