序列化表单以传递给ASP.Net Web API

时间:2016-04-26 16:03:24

标签: json ajax asp.net-web-api

在我离开并重新创建方向盘之前,有人能告诉我是否有自动执行此操作的方法吗?我有一个视图模型,其中包含另一个对象类型的数组,有点像这样:

public class ParentViewModel {
    public int ID { get; set; }
    public string Title { get; set; }

    public ChildViewModel[] Children { get; set; } 
}


public class ChildViewModel {
    public string Description { get; set; }
    public int Severity { get; set; }
}

我正在调用一个以父ViewViewModel作为参数的web api函数:

    [HttpPost]
    public void Test([FromBody]ParentViewModel vm) {
    }

这是从一个可以拥有动态数量的子实体的网页调用的。该页面是使用asp.net/Razor创建的,因此它们被绑定到带有HTML的输入字段,如下所示:

<input aria-invalid="false" class="form-control" id="Children_0__Description" name="Children[0].Description" value="test" type="text">

我有一个javascript事件处理程序,它使用ajax来调用web api。我想将表单数据传递给它,因此我将表单序列化,使用deparam将其转换为对象,并在对象上调用JSON.stringify。不幸的是,这并没有把像#34; Children [0] .Description变成对象数组的东西,所以当它遇到web api时它并没有被映射到视图的数组属性模型。即,我的JSON看起来像这样:

{
    "ID": "12",
    "Children[0].Severity" : "3",
    "Children[0].Description" : "Test", 
    "Children[1].Severity" : "5",
    "Children[1].Description" : "Another",
    "Title": "Hello"
}

而不是这样:

{
    "ID": "12",
    "Children" : [
        {"Severity":"3", "Description":"Test"},
        {"Severity":"5", "Description":"Another"},
        ],
    "Title": "Hello"
}

我正准备编写一些代码来改造json,但是我猜测我首先做错了什么,或者已经有了一些能为我做这件事的事情。 - 有什么建议吗?

2 个答案:

答案 0 :(得分:0)

请检查this link是否与您的问题相同。如果是,则需要在ajax调用头中添​​加contenttype。

答案 1 :(得分:0)

我不确定是否有更好的方法,但我已经解决了这个问题(没有什么能比较向别人描述你的问题以明白你的想法)。问题是deparam不是最好的库。相反,我找到了this库,它正是我所需要的。