这是我的jQuery,它查看HTML表并从tr和输入字段值获取id,并将它们放入一个对象中,以json字符串化并发布到MVC控制器。我正在使用jQuery 1.8.2
var rowdata = [];
$('table').find('tr').each(function () {
myjson = [];
item = {}
item["id"] = $(this).attr('id');
item["reason"] = $(this).find('input').val();
myjson.push(item);
rowdata.push(myjson);
});
jsonstring = JSON.stringify(rowdata);
$.ajax({
url: '@Url.Action("AbsentReason", "Attendance")',
data: jsonstring,
type: 'POST',
traditional: true,
contentType: 'json',
success: function (data) {
$('#message').html("Reason was updated");
}
});
这是检查有效的结果JSON。
[[{}],[{ “ID”: “6”, “理由”: “”}],[{ “ID”: “7”, “理由”: “”}],[{” ID “:” 15" , “理由”: “”}],[{ “ID”: “23”, “理由”: “”}],[{ “ID”: “29”, “理由”:” “}],[{” ID “:” 30" , “理由”: “”}],[{ “ID”: “31”, “理由”: “”}],[{ “ID”:“35 ”, “理由”: “”}],[{ “ID”: “40”, “理由”: “”}],[{ “ID”: “41”, “理由”: “”}],[ { “ID”: “42”, “理由”: “”}],[{ “ID”: “48”, “理由”: “”}],[{ “ID”: “49”, “理由” : “”}],[{ “ID”: “50”, “理由”: “”}],[{ “ID”: “51”, “理由”: “”}],[{ “ID”: “52”, “理由”: “”}],[{ “ID”: “53”, “理由”: “”}],[{ “ID”: “54”, “理由”: “”}] ,[{ “ID”: “55”, “理由”: “”}],[{ “ID”: “56”, “理由”: “”}],[{ “ID”: “57”,”原因 “:” “}],[{” ID “:” 58" , “理由”: “”}],[{ “ID”: “59”, “理由”: “”}],[{“编码“:” 60" , “理由”: “”}],[{ “ID”: “61”, “理由”: “”}],[{ “ID”: “62”, “理由”: “” }],[{ “ID”: “63”, “理由”: “”}],[{ “ID”: “74”, “理由”: “”}],[{ “ID”: “75” “原因”: “”}],[{ “ID”: “80”, “理由”: “”}],[{ “ID”: “81”, “理由”: “”}],[{ “ID”: “87”, “理由”: “”}],[{ “ID”: “88”, “理由”: “”}],[{ “ID”: “90”, “理由”: “”}],[{ “ID”: “91”, “理由”: “”}],[{ “ID”: “105”, “理由”: “”}],[{ “ID”:” 106" , “理由”: “”}],[{ “ID”: “107”, “理由”: “”}],[{ “ID”: “108”, “理由”: “”}],[{ “ID”: “110”, “理由”: “”}],[{ “ID”: “111”, “理由”: “”}],[{ “ID”: “119”, “理由”: “”}]]:
这是我的控制器的开始。
[HttpPost]
public ActionResult AbsentReason(string jsonstring)
{
return View("Index");
}
jsonstring参数始终为null。任何人都可以看到有什么问题吗?
更新
这是我的新控制器,基于评论使用模型并允许MVC为我工作。
[HttpPost]
public ActionResult AbsentReason(IEnumerable<VMAttendance> jsonstring)
{
return View("Index");
}
和我的viewmodel
public class VMAttendance
{
public int PersonID
{
get;
set;
}
public string Reason
{
get;
set;
}
}
参数仍然为空。我还更新了我的jQuery,试图发送正确的json。
var data = $('table').find('tr').map(function () {
var id = $(this).attr('id');
var reason = $(this).find('input').val();
var rowdata = { "PersonID": id, "Reason": reason };
return rowdata;
}).get();
$.ajax({
url: '@Url.Action("AbsentReason", "Attendance")',
data: data,
type: 'POST',
traditional: true,
contentType: 'json',
success: function (data) {
$('#message').html("Reason was updated");
}
});
我尝试将一些测试json发送到控制器,但参数仍为空。
var data = '{"PersonID":"6","Reason":""},{"PersonID":"7","Reason":""}'
答案 0 :(得分:3)
假设你有一个MVC模型如下
public class MyModel
{
public int ID {get;set;}
public string Reason {get;set;}
}
如果您将操作方法签名修改为
public ActionResult AbsentReason(IEnumerable<MyModel> json)
当你回发你的json对象时,json序列化器会将你的json反序列化为一个IEnumerable的MyModel。
答案 1 :(得分:3)
我通过将contentType从'json'更改为'application / json; charset = utf-8'并删除我的json中的第一个空对象,该对象是从表格中的额外tr创建的。 json看起来像
[{},{"PersonID":"6","Reason":""},{"PersonID":"7","Reason":""}]
它看起来应该是这样的
[{"PersonID":"6","Reason":""},{"PersonID":"7","Reason":""}]
我的控制器看起来像这样,效果很好。
[HttpPost]
public ActionResult AbsentReason(IEnumerable<VMAttendance> jsonstring)
{
return View("Index");
}
感谢Duy的帮助!
答案 2 :(得分:1)
将ajax对象中的contentType更改为字符串。
我很好奇你为什么要把你的json视为字符串而不是对象。通常我会有一个C#viewmodel并让序列化程序将json对象映射到我的控制器中的C#视图模型