ASP .NET MVC 4绑定json通过ajax发送到控制器中的自定义类无法正常工作

时间:2015-06-08 16:20:22

标签: 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);
        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。

请帮忙。

1 个答案:

答案 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足够智能以转换这些值。