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