我有以下控制器:
[HttpPost]
public JsonResult SaveCompensationComponent(int agencyId, CompensationComponentAllData compensationComponent)
{
int? id = _dmsCompensation.SaveCompensationComponent(agencyId, compensationComponent);
return Json(id, JsonRequestBehavior.AllowGet);
}
CompensationComponentAllData类的定义:
public class CompensationComponentAllData
{
some properties
...
public CompensationObject CompensationElement { get; set; }
public CompensationObject CompensationBasis { get; set; }
...
some properties
...
}
CompensationObject类:
public class CompensationObject
{
some properties
...
public ActivityData ByActivity { get; set; }
...
some properties
...
}
ActivityData类:
public class ActivityData
{
some properties
...
public List<int> GoalCategories { get; set; }
public List<int> Policies { get; set; }
...
some properties
...
public ActivityData() { }
public ActivityData(CompensationObjectByActivity record) {
...
}
}
在javascript中,我创建了适当的对象并通过ajax发送(contentType:&#39; application / json&#39;以及在发送数据之前使用的JSON.stringify)。一切都正确地发送到服务器,因为我在控制器中执行了以下代码:
HttpContext.Request.InputStream.Seek(0, SeekOrigin.Begin);
var jsonStringData = new StreamReader(HttpContext.Request.InputStream).ReadToEnd();
jsonStringData具有正确的值:
"{\"agencyId\":\"332\",\"compensationComponent\":{\"Id\":431,\"CompensationComponentInfoId\":509,\"AgencyJobPositionId\":\"306\",\"Name\":\"ggggggg44\",\"Description\":\"fdssssssss\",\"CompensationComponentImpactLevelId\":\"1\",\"CompensationProductionTypeId\":\"1\",\"CompensationFrequency\":{\"Id\":\"1\"},\"CompensationDateTypeId\":\"3\",\"EffectiveDate\":\"06/10/2015\",\"BasisDifferentThanElement\":false,\"CompensationElement\":{\"ObjectTypeId\":\"3\",\"ByActivity\":{\"CompensationAttributeId\":\"21\",\"UnitsId\":\"3\",\"PoliciesLevel\":\"Individual Company/Policy\",\"Policies\":[\"572\",\"139\",\"138\"],\"VerificationLevelId\":\"1\"}},\"CompensationBasis\":{\"ObjectTypeId\":\"3\",\"ByActivity\":{\"CompensationAttributeId\":\"21\",\"UnitsId\":\"3\",\"PoliciesLevel\":\"Individual Company/Policy\",\"Policies\":[\"572\",\"139\",\"138\"],\"VerificationLevelId\":\"1\"}},\"CompensationStructureId\":\"2\",\"CompensationRateId\":\"1\",\"FixedValue\":\"10.00\",\"UseChargeback\":false}}"
现在的问题是,在绑定后,CompensationComponent.CompensationElement.ByActivity.Policies具有空值,即使它应该是一个包含3个元素的列表。
让我更加困惑的是,同时fillComponent.CompensationBasis.ByActivity.Policies正确绑定。此外,compensationComponent.CompensationElement.ByActivity.GoalCategories也正确绑定。
编辑:
这是我的ajax电话:
$.ajax({
type: type,
url: url,
data: JSON.stringify(data),
success: callback,
error: function (xhr, ajaxOptions, thrownError) {
...
},
contentType: 'application/json',
cache: cache
});
如果我删除JSON.stringify并按照this post中的建议尝试某些内容,我会在绑定中收到错误,因此只返回500。
请帮忙。
答案 0 :(得分:0)
我认为您希望接收部分JSON作为方法参数有点奇怪。我认为你需要为root对象引入一个类:
public class CompensationModel
{
public int AgencyId { get; set; }
public CompensationComponentAllData CompensationComponent { get; set; }
}
您的控制器方法将此类作为参数:
[HttpPost]
public JsonResult SaveCompensationComponent(CompensationModel model)
我建议你使用像json2csharp这样的服务,让计算机做无聊的工作。
关于您发送的JSON的评论很少。 JSON.stringify
不会更改类型:
JSON.stringify({a: [1, 2, 3]}) // -> "{"a":[1,2,3]}"
JSON.stringify({a: ["1", "2", "3"]}) // -> "{"a":["1","2","3"]}"
因此,如果您在JSON中获得字符串,那么javascript值的类型为string
。在C#模型中,您希望有int
,因此您可能会考虑在javascript中转换数据,尽管MVC足够智能以转换这些值。