C# ASP.NET MVC 4绑定json通过ajax发送到控制器中的自定义类,但工作不正常

C# ASP.NET MVC 4绑定json通过ajax发送到控制器中的自定义类,但工作不正常,c#,asp.net,json,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,Json,Asp.net Mvc,Asp.net Mvc 4,我有以下控制器: [HttpPost] public JsonResult SaveCompensationComponent(int agencyId, CompensationComponentAllData compensationComponent) { int? id = _dmsCompensation.SaveCompensationComponent(agencyId, compensationComponent); ret

我有以下控制器:

    [HttpPost]
    public JsonResult SaveCompensationComponent(int agencyId, CompensationComponentAllData compensationComponent)
    {
        int? id = _dmsCompensation.SaveCompensationComponent(agencyId, compensationComponent);
        return Json(id, JsonRequestBehavior.AllowGet);
    }
HttpContext.Request.InputStream.Seek(0, SeekOrigin.Begin);
var jsonStringData = new StreamReader(HttpContext.Request.InputStream).ReadToEnd();
CompensationComponentAllData类的定义:

public class CompensationComponentAllData
{
    some properties

    ...

    public CompensationObject CompensationElement { get; set; }

    public CompensationObject CompensationBasis { get; set; }

    ...        

    some properties

    ...
}
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) {

        ...
    }
}
补偿对象类:

public class CompensationObject
{
    some properties

    ...

    public ActivityData ByActivity { get; set; }

    ...        

    some properties

    ...
}
ActivityData类:

public class CompensationComponentAllData
{
    some properties

    ...

    public CompensationObject CompensationElement { get; set; }

    public CompensationObject CompensationBasis { get; set; }

    ...        

    some properties

    ...
}
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) {

        ...
    }
}
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.Policys之后,它有一个空值,即使它应该是一个包含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)
我建议你使用一些服务,比如,让电脑来做那些无聊的工作

关于您发送的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足够智能地转换这些值。

< P>我认为你想接收JSON的一部分作为方法参数有点奇怪。我认为您需要为根对象引入一个类:

public class CompensationModel
{
    public int AgencyId { get; set; }
    public CompensationComponentAllData CompensationComponent { get; set; }
}
并且您的控制器方法将此类作为参数:

[HttpPost]
public JsonResult SaveCompensationComponent(CompensationModel model)
我建议你使用一些服务,比如,让电脑来做那些无聊的工作

关于您发送的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足够智能地转换这些值。

你是否尝试从Java>策略中更改JSON格式:[ 572,139,138 ] < /> >到<代码>“策略”:[ 572139138 ]所以它是以数字而不是字符串的形式发布的?您是否对此对象使用自定义模型活页夹?@br4d您的意思是什么时候?我有js中的int列表,但stringify将所有内容转换为string。如果这是一个问题,那么compensationComponent.CompensationBasis.ByActivity.Policys也不会绑定。@Mariusz我不使用自定义模型绑定器。请尝试从JSON中删除CompensationBasis,并检查第二个对象是否正确绑定,这可能会给我们一些提示。您是否尝试过将JSON格式从
“Policies”更改为:[“572”、“139”、“138”]
“政策”:[572139138]
所以它是以数字而不是字符串的形式发布的?你对这个对象使用自定义模型绑定器吗?@br4d你的意思是什么时候?我在js中有int列表,但stringify会将所有内容转换为字符串。如果这是个问题,那么compensationComponent.CompensationBasis.ByActivity.Policys也不会绑定。@Mariusz我不使用自定义model binder。尝试从JSON中删除CompensationBasis并检查第二个对象是否正确绑定,这可能会给我们一些提示。您是否尝试将JSON格式从
“策略”:[“572”、“139”、“138”]
更改为
“策略”:[572139138]
所以它是以数字而不是字符串的形式发布的?你对这个对象使用自定义模型绑定器吗?@br4d你的意思是什么时候?我在js中有int列表,但stringify会将所有内容转换为字符串。如果这是个问题,那么compensationComponent.CompensationBasis.ByActivity.Policys也不会绑定。@Mariusz我不使用自定义model binder。尝试从JSON中删除CompensationBasis,并检查第二个对象是否正确绑定,也许这会给我们一些提示。我这样做了,现在它甚至没有设置CompensationBasis的策略。当我将agencyId放入根模型时,它的行为与之前的根模型相同。现在我通过放置策略列表来解决问题我更新了我的答案。检查
CompensationModel
类和
SaveCompensationComponent
方法参数。我这样试过,现在它甚至没有为CompensationBasis设置策略。当我将agencyId设置为根模型时,它就像以前的根模型一样。现在我做了一个变通办法,将策略列表放在层次结构中更高的位置,它可以工作,但我真的想知道为什么会发生这种情况,我更新了我的答案。检查
CompensationModel
类和
SaveCompensationComponent
方法参数。我这样尝试,现在我甚至没有为CompensationBasis设置策略。当我将agencyId放入根模型时,它的行为与以前的根模型一样。现在我通过将策略列表放在层次结构的更高位置来解决问题,它起了作用,但我真的想知道为什么会发生这种情况,我更新了答案。检查
CompensationModel
class和
SaveCompensationComponent
方法参数。