JSON数据反序错误

时间:2017-05-19 05:37:34

标签: c# json ajax

所以我有一个自定义类:

public class CompanyInfo
{
    public int CompanyID { get; set; }
    public BasicInfo BasicInfo { get; set; }
    public EmployeesInfo EmployeesInfo { get; set; }
    ...
}

在我看来,我想将数据发送回我的控制器功能:

 [HttpPost]
 public JsonResult SaveCompanyInfoWithOutBalanceSheet(CompanyInfo model)
 {
    ...
 }

Ajax函数是这样的:

function onSubmit(){
    basicInfoFormData = $("#basicInfoForm").serialize();
    employeesInfoFormData = $("#employeesInfoForm").serialize();
    var companyInfoData = 
    {
      basicInfoFormData, employeesInfoFormData
    };
    $.ajax({
            type: "POST",
            url: '@Url.Action("SaveCompanyInfoWithOutBalanceSheet")',
            dataType: "json",
            data: JSON.stringify(companyInfoData),
            success: function (result) {
                if (result.Success)
                    secondStepOnSubmit();
                else
                    submitError();
            }
        });
}

当我运行ajax函数时,我的控制器函数会成功接收HTTP请求并将其转换为我的自定义类" CompanyInfo"。但是,这里有一个问题。最后一个属性cof我的" BasicInfo" class是string,属性的名称是" Website"。如果我在控制器方法中设置断点,我可以看到绑定器没有反序列化" Website"财产正确。以下是Binder分配给" Website"的价值。属性:

"test_email_address \",\"employeesInfoFormData\":\"EmployeesInfo.ID=0"

" test_email_address"是我为#34; WebSite"输入的内容但不知何故,活页夹包括" EmployeesInfo"也是 JSON string的一部分。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

当您希望C#Action(SaveCompanyInfoWithOutBalanceSheet)需要参数作为模型(CompanyInfo)时,您应该使用数据传递整个模型 - 模型的attribute值不是很少。

例如,如果您的Model有三个properties,如下所示

public class CompanyInfo
{
    public int CompanyID { get; set; }
    public BasicInfo BasicInfo { get; set; }
    public EmployeesInfo EmployeesInfo { get; set; }       
}

您的Controller Action如下所示

 [HttpPost]
 public JsonResult SaveCompanyInfoWithOutBalanceSheet(CompanyInfo companyInfo)
 {
    ...
 }

因此,在javascript函数中,您需要获取已分配给html控件的值。 生成模型的正确结构并将其作为参数传递。

在您的模型中,它包含一个int属性和两个单独的classes另外两个attributes。因此,当您发送参数时,请创建正确的结构并传递它。它应该工作

function onSubmit(){
    var companyIdValue =  $("#yourcompanyidtextbox").val();
    //Ensure the basicInfoFormData contains all the property values of BasicInfo class
    var basicInfoFormData = $("#basicInfoForm").serialize();
    //Ensure the employeesInfoFormData contains all the property values of EmployeesInfo class
    var employeesInfoFormData = $("#employeesInfoForm").serialize();
    var companyInfo = 
    {
      CompanyID : companyIdValue,
      BasicInfo : basicInfoFormData, 
      EmployeesInfo : employeesInfoFormData
    };
    $.ajax({
            type: "POST",
            contentType: 'application/json; charset=utf-8',
            url: '@Url.Action("SaveCompanyInfoWithOutBalanceSheet")',               
            data: JSON.stringify(companyInfo),
            success: function (result) {
                if (result.Success)
                    secondStepOnSubmit();
                else
                    submitError();
            },
            error: function (request, textStatus, errorThrown) {                    
               alert("Status: " + textStatus + "Error: " + errorThrown);
            }
        });
}

希望你清楚。