私はJSONにフォームデータをシリアライズし、データベースに保存され、コントローラでは:Asp.Netコア:jsonでIFormCollectionを直列化および逆シリアル化する方法
今[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を作成して設定できません。パス1 'の1行目の位置1に設定します。
タイプを指定しないと、デシリアライズは成功します。私は をIFormCollectionに逆シリアル化することをお勧めします。 IFormCollectionを逆シリアル化する適切な方法は何ですか?
また、私がjsonを保存しているのは、30種類以上のフォームを処理しているためです。それぞれに厳密に型指定されたモデルオブジェクトを作成したくないからです。アドバイスは大歓迎です。
具体的なタイプを知っていても、コンパイラーはどのようにインターフェースに逆シリアル化すると思いますか?インタフェースには実装がありません。インタフェースは 'new'キーワードでインスタンス化することはできません。あなたは**具体的な**型を提供する必要があるか、その型の中でそれを直列化したとき(あなたはjson内に_type(またはそれ)の属性を持つでしょう)、その型を破棄してそれをインタフェースに戻します: ' IFormCollection)JsonConvert.DeserializeObject(doc.Content) ' – Tseng