ASP 表单数组数据绑定
ASP Form Array Data binding
过去几天我一直在忙于解决这个问题,但我还没有找到关于如何处理这个问题的明确答案。
我有一个看起来像这样的模型:
class Activity
int Id
string Name
DateTime Date
int DurationMinutes
string Comment
ICollection<Tags> Tags
ICollection<Sources> Sources
常规属性将按应有的方式绑定。我还希望用户能够向 activity.
添加标签和来源
表单结构如下:
这是我目前的保存方式:
这样,数据将作为常规字符串发送。我想知道实现这个的好方法是什么。
我正在考虑创建一个自定义 ModelBinder 以 return 一个适当的 activity 因为所有源都需要首先创建。将数据存储在前端以执行此操作的正确方法是什么?还是这种做法完全错误?
如有任何建议,我们将不胜感激!
我 post 回答这个问题已经有一段时间了,但现在我已经完成了表格,我将在这里 post 我的解决方案。
前端部分已经包含在问题本身中,随请求一起发送的 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# 中,我创建了一个自定义模型绑定器来绑定所有数据,如下所示:
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
过去几天我一直在忙于解决这个问题,但我还没有找到关于如何处理这个问题的明确答案。
我有一个看起来像这样的模型:
class Activity
int Id
string Name
DateTime Date
int DurationMinutes
string Comment
ICollection<Tags> Tags
ICollection<Sources> Sources
常规属性将按应有的方式绑定。我还希望用户能够向 activity.
添加标签和来源表单结构如下:
这是我目前的保存方式:
这样,数据将作为常规字符串发送。我想知道实现这个的好方法是什么。
我正在考虑创建一个自定义 ModelBinder 以 return 一个适当的 activity 因为所有源都需要首先创建。将数据存储在前端以执行此操作的正确方法是什么?还是这种做法完全错误?
如有任何建议,我们将不胜感激!
我 post 回答这个问题已经有一段时间了,但现在我已经完成了表格,我将在这里 post 我的解决方案。
前端部分已经包含在问题本身中,随请求一起发送的 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# 中,我创建了一个自定义模型绑定器来绑定所有数据,如下所示:
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