在MVC4项目中,我有一个包含部分视图的表单,该视图是在学校学习的语言的索引视图。它是默认类型视图模板索引,每行添加,删除,编辑链接等。当您添加或编辑时,它会打开语言的“添加”或“编辑”视图。例如添加语言后,将返回更新的部分视图。
我的问题是,如果用户打开语言表单,主表单上的编辑和捕获将会丢失。在打开语言表单之前,我不能只进行Ajax保存,因为主表单可能只是部分完成并且验证失败。我正在考虑做的是使用AjaxPreserve
动作,它采用FormCollection
,并将其存储在会话中(o在磁盘上或任何地方),因此不会执行模型绑定和服务器验证。 / p>
然后我有两个问题:我需要在调用AJAX操作之前禁用客户端验证,我需要使用之前保存的FormCollection
重新填充主表单。我认为应该有一些jQuery voodoo来禁用客户端验证,但我完全难以重新填充表单。
替代解决方案:我可以使用pop-ip表单中的编辑器模板,而不是使用“子表单”,而不需要FK ID,但仅限于某些情况下,所以我的问题仍然存在。
答案 0 :(得分:2)
你可以使用像Knockout这样的东西来创建javascript模型并将其绑定到网格/对话框编辑/模板视图。我会将整个数据转换为JS模型,将其绑定到表/网格,然后跟踪客户端的所有更改。完成所有操作后,只需将整个模型序列化回服务器并更新数据存储。 如果这是一个可接受的场景,它将为您节省很多麻烦。 熟悉Knockout是必需的,但如果您以前使用它,您将能够以非常干净和有效的方式解决这个问题。
Knockout网站上的这个例子给出了我想要建议的内容。编辑,删除,添加在客户端完成,直到您将所有数据发送回服务器。您需要跟踪每个对象的标记,以了解它是否已添加,编辑或删除。
答案 1 :(得分:1)
使用Ajax简单地制作添加语言的子请求,并在成功保存时重新填充下拉列表或者您在主窗体上接受语言的方式。
* 这将节省很多精力。 *
答案 2 :(得分: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或任何其他类型的对象 - >所以它可以在服务器端验证。
答案 3 :(得分:0)
将值保存到本地存储是否可以接受?那么使用TempData呢?