2017-03-27 28 views
2

私は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種類以上のフォームを処理しているためです。それぞれに厳密に型指定されたモデルオブジェクトを作成したくないからです。アドバイスは大歓迎です。

+0

具体的なタイプを知っていても、コンパイラーはどのようにインターフェースに逆シリアル化すると思いますか?インタフェースには実装がありません。インタフェースは 'new'キーワードでインスタンス化することはできません。あなたは**具体的な**型を提供する必要があるか、その型の中でそれを直列化したとき(あなたはjson内に_type(またはそれ)の属性を持つでしょう)、その型を破棄してそれをインタフェースに戻します: ' IFormCollection)JsonConvert.DeserializeObject(doc.Content) ' – Tseng

答えて

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オブジェクトに定義されているすべてのデータにアクセスできます(Objeあなたのケースではctの名前が変わる可能性があります)

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

contact.Data.Name; 
+0

ASP.NET Coreは内部的にどのように内容をシリアル化しますか? – Shimmy

関連する問題