3

在一个 MVC4 项目中,我有一个包含部分视图的表单,它是在学校学习的语言的索引视图。它是默认类型视图模板索引,每行包含添加、删除、编辑链接等。添加或编辑时,它会打开语言的添加或编辑视图。例如添加语言后,返回更新的局部视图。

我的问题是,如果用户打开语言表单,主表单上的编辑和捕获将丢失。我不能在打开 Language 表单之前进行 Ajax 保存,因为主表单可能只是部分完成并且验证失败。我正在考虑做的是使用一个AjaxPreserve动作,它需要 aFormCollection并将其存储在会话中(o 在磁盘上或任何地方),因此不执行模型绑定和服务器验证。

然后我有两个问题:我需要在调用 AJAX 操作之前禁用客户端验证,并且我需要使用FormCollection我之前保存的重新填充主表单。我认为应该有一些 jQuery voodoo 来禁用客户端验证,但我完全无法重新填充表单。

替代解决方案:我可以使用pop-ip表单中的编辑器模板代替使用“子表单”,其中不需要FK ID,但仅在某些情况下才需要,所以我的问题仍然存在。

4

4 回答 4

2

您能否使用类似 Knockout 的方法创建 javascript 模型并将其绑定到网格/对话框编辑/模板视图。我会将整个数据转换为 JS 模型,将其绑定到表/网格,然后跟踪客户端的所有更改。完成后,只需将整个模型序列化回服务器并更新数据存储。如果这是一个可接受的方案,它将为您省去很多麻烦。需要熟悉 Knockout,但如果您以前使用过它,您将能够以非常干净和有效的方式解决这个问题。

Knockout 网站上的这个例子给出了我试图建议的想法。编辑、删除、添加在客户端完成,直到您将所有数据发送回服务器。您需要跟踪每个对象的标志,以了解它是否被添加、编辑或删除。

http://knockoutjs.com/examples/contactsEditor.html

于 2013-02-05T19:43:16.527 回答
1

简单地发出使用 Ajax 添加语言的子请求并重新填充下拉列表或您在成功保存时在主窗体上接受语言的任何方式。

*这样会省很多力气。*

于 2013-02-08T11:14:36.137 回答
1

你为什么不只使用javascript?例如,您有存储一些数据的主窗体。当您需要添加特定的语言时,您可以使用部分视图打开弹出窗口,允许用户填写表单,但是当用户按下提交时,您会使用 js 拦截操作,将内容保存到 javascript 数组/对象或其他任何内容,并可能将其存储在主表单的隐藏字段 - 用于最终提交

var newData = new Object();
newData.Field1 = $("#yourField1");
...
lanuageData.push(newData);
$("#languageContainer").val(JSON.stringify(languageData));
...

DataAnnotation 验证也适用于:

$.validator.unobtrusive.parse("your_partial_view_container");

当您需要编辑一些已添加到 js 数组的对象时 - 打开弹出窗口并用您的 js 数组的元素填充它。所以基本上你在客户端做所有的 CRUD,只在最终提交时保存更改。为了使控制器中的代码更清晰,您可以使用自定义模型绑定器,将一些字符串字段从 JSon 反序列化为 List 或任何其他类型的对象 -> 以便可以在服务器端对其进行验证。

于 2013-02-08T13:29:40.480 回答
0

将您的值保存到本地存储是否可以接受?使用 TempData 怎么样?

于 2013-02-01T21:29:44.820 回答