在控制器中,我将表单数据序列化为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种左右的表单,我不想为每种表单创建强类型模型对象。欢迎任何建议。
答案 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;