过去几天我一直在忙着解决这个问题,试图解决这个问题,但我还没有找到一个明确的答案来解决这个问题。
我的模型看起来像这样:
class Activity
int Id
string Name
DateTime Date
int DurationMinutes
string Comment
ICollection<Tags> Tags
ICollection<Sources> Sources
常规属性将按照应有的方式绑定。我还希望用户能够为活动添加标签和来源。
以下是表单结构:
这样,数据将作为常规字符串发送。我想知道实现这个的好方法。
我正在考虑创建一个自定义的ModelBinder来返回一个正确的活动,因为所有需要首先创建的源。在前端存储数据的正确方法是什么?或者这种做法完全错了?
非常感谢任何建议!
答案 0 :(得分:0)
自从我发布这个问题已经有一段时间了,但现在我已经完成了表格,我将在这里发布我的解决方案。
问题本身已经涵盖了前端部分,并且随请求发送的JSON如下所示:
{"Type":"Book","Details":{"Name":"Book1","Chapter":"1","StartPage":"5","EndPage":"23"}},{"Type":"WebPage","Details":{"Name":"Page1","Url":"sometesturl.com","PageTypeIDs":"1"}}
此数据将绑定到ICollection&lt;来源&gt;正如问题所示。
我遇到的问题是JSON没有处于有效格式,因为该字符串包含多个JSON对象,但不在数组[]中。
在C#中,我创建了一个自定义模型绑定器来绑定所有数据,如下所示:
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反序列化过程的建议我会很荣幸。
注意:我已经创建了一个dynamicForm jQuery函数,它可以生成(可选)基于JSON的表单,并将结果作为JSON输出到HTML元素。 它在GitHub上:
github.com/noelheesen/jQuery.dynamicForm