将表单序列化为字符串并稍后将其解除复制到复杂视图模型

时间:2018-02-05 11:30:44

标签: javascript c# jquery .net asp.net-mvc

我正在实施"保存草稿"动态生成的页面上的功能,并尝试使其尽可能通用。我的所有控制器和页面都应该支持它,这就是为什么我想在我的基本控制器中创建一个SaveDraft() POST动作的原因,它将接收一个序列化的形式作为字符串,可以直接保存到数据库中并反序列化稍后在使用特定视图模型的特定get操作中的视图模型

[HttpPost]
public ActionResult SaveDraft(string jsonData, long id)

我的第一个想法是创建通用基本控制器并将视图模型类型传递给它,但问题是某些控制器有多个不同命名的POST操作并使用不同的视图模型类型,我现在无法更改< /强>

某些视图模型很复杂,看起来像

public class CollateralsDataModel
{
    //...
    public List<Applicant> Applicants { get; set; }
}

public class Applicant
{
    public long ApplicantId { get; set; }
    public IList<RealEstateSecurityCollateralsDTO> RealEstateSecurityCollaterals { get; set; }
    public IList<AdditionalCollateralDTO> AdditionalCollaterals { get; set; }
}

public class RealEstateSecurityCollateralsDTO
{
    [Required]
    [Display(ResourceType = typeof(CollateralsData), Name = nameof(CollateralsData.RealEstateSecurityType))]
    public int? RealEstateSecurityTypeId { get; set; }
    //...
}

表单上的输入名称看起来像

"Applicants[0].MortgageApplicantId": "11595",
"Applicants[0].RealEstateSecurityCollaterals[0].Id": "17",
"Applicants[1].MortgageApplicantId": "11596",
"Applicants[1].RealEstateSecurityCollaterals.Index": "0",
"Applicants[1].AdditionalCollaterals[0].Id": "138",
"Applicants[1].AdditionalCollaterals[0].AdditionalCollateralTypeId": "4",

我的问题是 - 如何将它们序列化为字符串以便稍后反序列化?

我尝试使用

的不同组合
$('.draft-data-form').serializeArray() 
$('.draft-data-form').serialize()
JSON.stringify($('.draft-data-form').serializeArray());

但是在我的Action中,我获得了扁平的JSON结构,我无法对其进行反序列化

var obj = JsonConvert.DeserializeObject<CollateralsDataModel>(jsonData);

无法将当前JSON数组(例如[1,2,3])反序列化为类型&#39; ... Collat​​eralsDataModel&#39;因为类型需要JSON对象(例如{&#34; name&#34;:&#34; value&#34;})才能正确反序列化。 要修复此错误,请将JSON更改为JSON对象(例如{&#34; name&#34;:&#34; value&#34;})或将反序列化类型更改为实现集合接口的数组或类型(例如ICollection,IList)就像可以从JSON数组反序列化的List。 JsonArrayAttribute也可以添加到类型中以强制它从JSON数组反序列化。

我还尝试将其反序列化为列表,但随后我获得了115个条目的列表

var obj = JsonConvert.DeserializeObject<List<CollateralsDataModel>>(jsonData);

所以我的问题是 - 如何将它们序列化为字符串以便稍后反序列化?

1 个答案:

答案 0 :(得分:0)

您不希望序列化/反序列化List。只有一个模型实例。

我猜这个错误是在实例化模型中的列表。我知道DataContractSerializer有一个问题,如果在构造模型时没有将List实例化为空列表,则反序列化无法添加到它。

不确定这是否与您面临的问题相同,但值得一试。

例如。使用方法:

public List<Applicant> Applicants { get; set; } = new List<Applicant>();