我的javascript
function SaveData(status) {
var reserved = [];
var id = -1;
$('#fdEitDetail').find('table tr').each(function (index, item) {
var isChk = $(item).find('input:checkbox').is(':checked') ? 0 : 1;
id = $(item).attr('name');
reserved.push({ ID: $(item).attr('id'), IsChecked: isChk, Comment: $(item).find('textarea').val() });
});
var dataset = JSON.stringify({ checkList: reserved, status: status, machineID: id });
$.ajax({
url: '/Home/UpdateData',
contentType: "application/json; charset=utf-8",
type: 'POST',
data: dataset,
success: function (result) {
alert(result);
}
});
}
我正在调用此控制器操作:
public JsonResult UpdateData(string checkList, int status,int machineID)
{
var response =
new JavaScriptSerializer().Deserialize<List<PMICheckListRequest>>(checkList);
return Json("value = Success");
}
班级
public class PMICheckListRequest
{
public int ID { get; set; }
public int IsChecked { get; set; }
public string Comment { get; set; }
}
在控制器动作中,来自ajax请求的parameterstatus
,machineID
都具有我在javascript中设置的值,但checkList
始终为null
。
答案 0 :(得分:3)
只需使用视图模型并停止那些需要解析的字符串:
public class MyViewModel
{
public PMICheckListRequest[] CheckList { get; set; }
public int Status { get; set; }
public int MachineID { get; set; }
}
作为控制器操作的参数:
public ActionResult UpdateData(MyViewModel)
{
// NO NEED TO BE DOING ANY PLUMBING DESERIALIZATION HERE
// THE VIEW MODEL ALREADY CONTAINS EVERYTHING YOU NEED
return Json("value = Success");
}
请注意视图模型是如何包含PMICheckListRequest
数组的,其中每个元素都包含已在AJAX请求中填充的属性ID
,IsChecked
和Comment
。< / p>
答案 1 :(得分:2)
checkList
参数为null
的原因是因为您尝试将复杂对象JSON数组(即[{}, {}]
)绑定到string
,当类型并不真正兼容。
试试这个,
public JsonResult UpdateData(
List<PMICheckListRequest> checkList,
int status,
int machineID)
{
return Json("value = Success");
}
您不必手动反序列化;模型活页夹会为你做到这一点。
另外请注意,创建视图模型以更有条理的方式保存数据并不是一个坏主意,就像@DarinDimitrov所示,
public JsonResult UpdateData(
PMICheckListRequestViewModel model)
{
return Json("value = Success");
}
...
public class PMICheckListRequestViewModel
{
public List<PMICheckListRequest> CheckList { get; set; }
public int Status { get; set; }
public int MachineID { get; set; }
}
将来会更加灵活。