asp.net MVC 4绑定json通过ajax发送到控制器中的自定义类不能正常工作
本文关键字:不能 自定义 常工作 工作 控制器 绑定 MVC net json 通过 ajax | 更新日期: 2023-09-27 17:54:12
我有以下控制器:
[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: 'application/json'和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个元素的列表。
更让我困惑的是,与此同时,compensationComponent.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和尝试一些建议在这篇文章中,我得到错误的绑定,所以500只是返回。
请帮。
我认为这有点奇怪你想接收JSON的一部分作为方法参数。我认为你需要为根对象引入一个类:
public class CompensationModel
{
public int AgencyId { get; set; }
public CompensationComponentAllData CompensationComponent { get; set; }
}
你的控制器方法将把这个类作为参数:
[HttpPost]
public JsonResult SaveCompensationComponent(CompensationModel model)
我建议你使用json2sharp这样的服务,让我们的电脑来做这些无聊的工作。
和一些关于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是足够聪明的转换这些值。