我发送了一个jQuery Ajax请求:
$scope.geo.setSuburbs2 = function(areaId) {
var idData = JSON.stringify({ 'areaId': 3, 'agentId': 1 });
$.ajax({
url: "/Area/SuburbsJson",
method: "POST",
data: idData,
dataType: "ajax"
}).then(function(idData) {
alert("Done!");
},
function(data, status) {
alert("Error: " + status);
});
};
这应该是由ID为AreaId
的代理提供服务的ID为agentId
的郊区。返回的郊区是viewmodel上数组中的键值对。当我在控制器上收到模型时,数组中的所有键仍然正确,但所有数值都是null
。
当我从data
来自$.ajax
来电时发送{ 'areaId': 3, 'agentId': 1 }
选项时,
OnActionExecuting
我在Web应用程序中获得了相同大小的键值数组,在控制器的{ 'areaId': null, 'agentId': null }
中,上面的数组项如下所示:
JsonDotNet
我强烈怀疑浏览器上存在序列化问题,因为空值尚未到达我的JsonDotNet
自定义(来自Web)序列化程序。当我将数据发送回用户界面时,我通常只使用它来改善POST共振中的序列化。
这是一个已知的问题,还是我必须在List<CheckListItemModel>
序列化器上查看所有设置,一个很长的列表?如果这是一个已知问题,我该怎么办呢?
视图模型为public class CheckListItemModel
{
public int Id { get; set; }
public string Label { get; set; }
public bool IsChecked { get; set; }
}
,其中:
null
我没有使用序列化视图模型在控制器和UI之间进行通信,我只是将UI Angular控制器函数传递给列表的过滤器ID,然后返回序列化列表,所有数值都设置为{ {1}}。
将正确数据发送到UI的操作是:
public JsonResult SuburbsJson(int areaId, int agentId)
{
var allBurbs = _areaClient.GetSuburbs(areaId).ToList();
var agentBurbIds = _agentClient.GetAgentSuburbs(agentId).Select(s => s.SuburbId).ToList();
var model = new List<CheckListItemModel>();
foreach (var burb in allBurbs)
{
model.Add(new CheckListItemModel { Id = burb.SuburbId, Label = burb.SuburbName, IsChecked = agentBurbIds.Contains(burb.SuburbId) });
}
return Json(model, JsonRequestBehavior.DenyGet);
}
这是Id
和IsChecked
的问题。如果其Id
位于与该SuburbId
相关联的代理列表中,则已检查该项。
答案 0 :(得分:1)
JSON.stringify()方法将JavaScript值转换为JSON 串,
重新检查您的有效负载构造。你需要将实际的JavaScript对象字符串化,如...
$scope.geo.setSuburbs2 = function(areaId) {
var value = { areaId: 3, agentId: 1 }; //Object to be sent to controller
var idData = JSON.stringify(value);
$.ajax({
url: "/Area/SuburbsJson",
type: "POST",
contentType: 'application/json',
dataType: 'json',
data: idData
}).then(function(idData) {
alert("Done!");
},
function(data, status) {
alert("Error: " + status);
});
};
删除键上的单引号。另请注意对请求如何对控制器进行的更改。