【发布时间】:2014-03-13 01:06:23
【问题描述】:
我正在尝试在发送到我的服务器的 POST 请求中添加一些额外的数据。最初,我只发送了几种形式的信息:
$.ajax({
url: 'SaveAllDetails',
type: 'POST',
data: $('form').serialize(),
dataType: 'json'
});
和MVC控制器方法:
[HttpPost]
public ActionResult SaveAllDetails([Bind(Prefix = "order")]ExistingOrderDetailsModel existingOrderDetailsModel,
[Bind(Prefix = "task")]ExistingTaskDetailsModel existingTaskDetailsModel, [Bind(Prefix = "device")]DeviceDetailsModel deviceDetailsModel)
{
....
}
这很好用。 MVC 的模型绑定器能够正确反序列化 URL 编码的字符串。
现在,要求发生了变化。我需要连同我的三个表格一起发送一个额外的数据数组。此数据数组不保存在表单中,也没有绑定前缀。我需要在同一个 Controller 方法中完成这一切,因为所有验证都需要在单个事务中执行。
所以,我现在得到了:
var subcomponentsGridRows = JSON.stringify(subcomponentsDetailsView.getAllGridData());
var existingOrderDetailsFormData = $('form#existingOrderDetailsForm').serialize();
var existingTaskDetailsFormData = $('form#existingTaskDetailsForm').serialize();
var deviceDetailsFormData = $('form#existingDeviceDetailsForm').serialize()
$.ajax({
url: 'SaveAllDetails',
type: 'POST',
data: {
existingOrderDetailsModel: existingOrderDetailsFormData,
existingTaskDetailsModel: existingTaskDetailsFormData,
deviceDetailsModel: deviceDetailsFormData,
subcomponentsGridRows: subcomponentsGridRows
},
dataType: 'json'
});
这不起作用至少有一个原因。每个表单都表示为 URL 编码的字符串。 subcomponentsGridRows 是一个 JSON 结构。据我所知,MVC 模型绑定器无法一次性破译这两种类型的信息。
解决这个问题的好方法是什么?
【问题讨论】:
-
subcomponentsGridRows is a JSON structure and the MVC model binder isn't capable of deciphering that mess。为何如此?如果你创建了一个代表这个结构的模型(比如说,使用这个网站:json2csharp.com),那么模型绑定器会很高兴地绑定到它。 -
您可以在提交之前合并数据或在 POST url 中使用 GET 传递其他信息...
-
@SimonWhitehead 当我将数据发布到服务器时,我必须指出我发送的信息类型。表单是 URL 编码的实体。网格数据是 JSON 结构。 MVC 会很乐意接受其中一个,但据我所知,没有一种简单的方法可以将两者结合到一个请求中。
-
@dandavis 但我将如何合并两者?一种是 URL 编码的字符串,另一种是 JSON 结构。我看了这个答案:stackoverflow.com/questions/17038396/… 但数据仍然没有通过。
-
把url字符串变成一个对象,然后合并。 js 库和 .net 提供 queryString 解析器。
标签: c# javascript asp.net-mvc