【发布时间】:2016-11-16 15:43:24
【问题描述】:
我在控制器中有一个动作:
public int Edit(MyViewModel viewModel)
{
// code to edit
}
我正在发布一个表格:
$.post("/MyController/Edit", $("#form").serialize()).then(
function () {
$("#dialog1").dialog("close");
$("#list-grid").trigger('reloadGrid');
});
这很好用。我得到的参数格式和MyViewModel一样。
但是,我需要再向操作传递一个参数。所以我将控制器更改为:
public int Edit(MyViewModel viewModel, string oldValue)
{
// code to edit
}
现在,我尝试使用以下方式通过 ajax 调用将 viewModel 和 oldValue 传递给操作:
var object = $("#form").serialize();
$.ajax({
url: '@Url.Action("Edit", "MyController")',
type: "POST",
contentType: // please see below
data: { viewModel: object, oldValue: oldVal},
dataType: // please see below
contentType: 'application/json',
success: function (response) {
alert("Successfully updated!");
}
});
虽然我能够得到oldValue 的值,但viewModel 的值是null,尽管在控制台中检查时它与$.post(...) 中发送的值完全相同。
如果我将contentType 指定为以下任何一个:
application/x-www-form-urlencoded; charset=UTF-8 或,
application/json; charset=utf-8 或,
application/json
调用失败。
我尝试过不指定dataType,也尝试将其指定为json,但没有成功。
创建自定义类来反序列化发送的json 是不可行的。
我该如何解决这个问题?
【问题讨论】:
-
试试这个:
data: JSON.stringify({ viewModel: object, oldValue: oldVal}) -
您可以使用
$.param()向序列化对象添加额外的名称/值对 - 请参阅this answer -
我改为使用
.serializeArray()并添加了一个新字段。如果您需要在序列化表单中编辑一些值,这是一个更好的选择。
标签: json ajax asp.net-mvc