Asp.Net核心:如何json序列化和反序列化IFormCollection?

时间:2017-03-27 07:53:54

标签: asp.net json asp.net-core json-deserialization

在控制器中,我将表单数据序列化为json并保存到数据库:

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create(IFormCollection formData)
{
    var json = JsonConvert.SerializeObject(formData);
    var doc = new Doc()
    {
        Subject = formData["subject"],
        Content = json
    };

    _context.Docs.Add(doc);
    _context.SaveChanges();

    return RedirectToAction("Edit", new { Id = doc.Id });
}

现在,我想反序列化表单数据并重新构建表单:

public IActionResult Edit(int id)
{
    var doc = _context.Docs
        .Where(o => o.Id == id).FirstOrDefault();

    if (doc == null)
    {
        ViewData["ErrorMessage"] = "Not found";
        return View("Error");
    }

    var formData = JsonConvert.DeserializeObject<IFormCollection>(doc.Content);
    ViewData["FormData"] = formData;

    return View(doc);
}

以上内容将在反序列化时引发异常:

  

JsonSerializationException:无法创建和填充列表类型Microsoft.AspNetCore.Http.IFormCollection。路径&#39;&#39;,第1行,第1位。

如果我没有指定类型,则反序列化成功;但我更喜欢它 要反序列化为IFormCollection。反序列化IFormCollection的正确方法是什么?

另外,我保存json的原因是因为我处理了30种左右的表单,我不想为每种表单创建强类型模型对象。欢迎任何建议。

1 个答案:

答案 0 :(得分:1)

我以前在数据库中处理json对象的方式:

在您的实体对象中添加另一个类来处理与json对象的映射:

public class Contact
{
    public int Id { get; set; }
    internal string _Data { get; set; }

    [NotMapped]
    public UserData Data
    {
        get { return _Data == null ? null : JsonConvert.DeserializeObject<UserData>(_Data); }
        set { _Data = JsonConvert.SerializeObject(value); }
    }
}

public class UserData
{
    public string Name { get; set; }

    //Add your json data here
}

我的控制器看起来像

public IActionResult Add(AddContactViewModel model)
{
        var contact = new Contact()
        {
            Data = JsonConvert.DeserializeObject<UserData>(model.Data.ToString())
        };
        _contactService.Add(contact);
        return new OkObjectResult(contact);
}

public class AddContactViewModel
{
    public JObject Data { get; set; }
}

感谢映射,当您访问对象联系人包含的对象数据时,您可以访问在UserData对象中明确定义的所有数据(对象名称可以在您的情况下更改)

var contact = new Contact()
{
    Data = JsonConvert.DeserializeObject<UserData>(model.Data.ToString())
};

contact.Data.Name;