私はこの質問を投稿して以来、しばらくしていますが、今私は解決策を投稿するフォームを完成しました。
フロントエンド部分はすでに質問自体に覆われていたとの要求で送信取得JSONは次のようになります。
{"Type":"Book","Details":{"Name":"Book1","Chapter":"1","StartPage":"5","EndPage":"23"}},{"Type":"WebPage","Details":{"Name":"Page1","Url":"sometesturl.com","PageTypeIDs":"1"}}
に見られるように、このデータは、ICollectionを<ソース>にバインドされます質問。
文字列が複数のJSONオブジェクトを保持していますが、配列[]内にないため、JSONが有効なフォーマットになっていないという問題がありました。
C#では私はそうのようなすべてのデータをバインドするためのカスタムmodelbinderを作成しました:
public class ActivityTimerModelBinder : IModelBinder { }
私はフォームデータを取得:
string sourcesJSON = request.Form.Get("Sources");
その後方法自体:
private List<Source> CreateSourcesFromJSON(string inputJSON)
{
List<Source> sources = new List<Source>();
string validjson = "[" + inputJSON + "]";
dynamic[] items = jsSerializer.Deserialize<dynamic>(validjson);
foreach (var item in items)
{
string type = item["Type"];
string serialized = jsSerializer.Serialize(item["Details"]);
switch (type)
{
case "Book":
Book b = jsSerializer.Deserialize<Book>(serialized);
sources.Add(b);
break;
case "WebPage":
WebPage p = jsSerializer.Deserialize<WebPage>(serialized);
sources.Add(p);
break;
default:
break;
}
}
return sources;
}
まだ、jsonのこの非直列化プロセスを改善する方法についての提案があれば、私は賞賛されるでしょう。
注:私はJSONに基づいてフォームを生成し(オプション)、その結果をJSONとしてHTML要素に出力するdynamicForm jQuery関数を作成しました。 ここにGitHubがあります:
github.com/noelheesen/jQuery.dynamicForm