【问题标题】:JSON data deserialized incorrectlyJSON 数据反序列化不正确
【发布时间】:2017-05-19 05:37:33
【问题描述】:

所以我有一个自定义类:

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”类是string,属性名称是“Website”。如果我在控制器方法中设置断点,我可以看到绑定程序没有正确反序列化“Website”属性。以下是 Binder 分配给“Website”属性的值:

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

test_email_address”是我为“WebSite”输入的内容,但不知何故,活页夹还包括 JSON string 的“EmployeesInfo”部分的开头。有什么想法吗?

【问题讨论】:

  • 你需要在你的请求对象中设置指定的contentType: "application/json",jQuery x-form-url-encodes默认是body。
  • 它是否按照上面的评论“contentType:”application/json“”?
  • @AluanHaddad 嘿,我尝试添加 contentType:"application/json" 但它不起作用,实际上现在我的控制器函数中的模型为空
  • 确切地说,当您希望您的 C# 方法 (EditAssetOnboarding) 需要参数作为模型时,您应该使用数据传递整个模型 - 模型的属性值不少
  • @AluanHaddad 我在这里很困惑,我该怎么办?

标签: c# json ajax


【解决方案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);
            }
        });
}

希望你清楚。

【讨论】:

    猜你喜欢
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 2019-05-02
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 2015-01-04
    相关资源
    最近更新 更多