【发布时间】:2011-05-20 21:05:04
【问题描述】:
我有一个从客户端接收复杂 JSON 对象的操作方法。我在客户端序列化这个对象,由于复杂性,我不能(不想)使用表单提交来发布数据。
我还需要能够连同这个 ajax 请求一起发送文件。我的操作方法完美地工作并使用 jQuery.ajax() 很好地绑定 JSON 对象(实际上是对象列表)。当我移动到ajax form plugin 以便我可以发送文件时,对象绑定会中断。我尝试使用插件提交表单并将我的对象作为附加数据发送。 action 方法不再看到我的对象。
关于如何将 JSON 和文件一起发布到同一个操作方法有什么想法吗?
这是有效的 jQuery.ajax() 方法。这里没有提交表单,这只是向服务器发送 JSON 数据
$.ajax({
url: "/Controller/Create2",
type: 'POST',
data: JSON.stringify(model),
dataType: 'json',
contentType: 'application/json, charset=utf-8',
beforeSend: function () {
},
success: function (data) {
},
error: function () {
}
});
我的 Action 方法以这种方式完美地获取对象列表。
public ActionResult Create2(List<CreateModel> model)
{
//Do stuff
}
但是当我在表单上执行 ajax 提交并附加数据时,模型返回 null。
f.ajaxSubmit({
url: "/Controller/Create2",
type: "POST",
data: JSON.stringify(model),
dataType: 'json',
contentType: 'application/json, charset=utf-8',
beforeSend: function () {
},
success: function (data) {
},
error: function (data) {
}
});
我需要在 Action Method 中保留绑定到 JSON 对象的功能,这是否意味着我必须放弃发布文件?
【问题讨论】:
-
第二种方法中你要发布的文件在哪里?
-
该文件是表单 (f) 的一部分。抱歉,不清楚。 ajaxSubmit 插件(我在上面链接过)负责通过隐藏的 iFrame 技术发布文件
-
只要它是一个插件,你如何在你可能导入的 .js 中查看它的源代码,看看它是如何序列化/发布文件的,然后将它的那部分提取到你自己的客户端的方法。然后使用你的第一个有效的 AJAX 方法,发布你的序列化模型,以及一个以插件方式序列化的文件,然后将第二个参数添加到你的 Action 方法。
-
你从哪里/如何得到这个
modeljavascript 变量,你试图 JSON 字符串化?你是手动构建的吗?如果是,数据来自哪里?用户可以通过一些 UI 修改这个变量中包含的数据吗?如果是,可能它们应该直接成为您提交的表单的一部分。如果不是,它们也可能是您提交的表单的一部分,但作为隐藏字段,甚至更好的是作为包含 id 的单个隐藏字段,允许您从它们最初来自的任何位置重新获取服务器上的这些值。 -
表格是动态的。用户可以添加和删除许多不同的字段,还可以提交具有不同数量的自定义字段的多个对象。我的第一个版本试图通过 html 属性来索引和跟踪所有这些,但它太多了。允许用户完成所有工作,然后在他们尝试提交时序列化对象,这样会更简洁。
标签: jquery asp.net-mvc ajax json