ASP表单数组绑定

时间:2016-04-19 11:17:16

标签: asp.net arrays forms http-post

过去几天我一直在忙着解决这个问题,试图解决这个问题,但我还没有找到一个明确的答案来解决这个问题。

我的模型看起来像这样:

class Activity
    int Id
    string Name
    DateTime Date
    int DurationMinutes
    string Comment

    ICollection<Tags> Tags
    ICollection<Sources> Sources

常规属性将按照应有的方式绑定。我还希望用户能够为活动添加标签和来源。

以下是表单结构:

form visual

以及我目前如何保存它: result

这样,数据将作为常规字符串发送。我想知道实现这个的好方法。

我正在考虑创建一个自定义的ModelBinder来返回一个正确的活动,因为所有需要首先创建的源。在前端存储数据的正确方法是什么?或者这种做法完全错了?

非常感谢任何建议!

1 个答案:

答案 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