Javascript 将具有嵌套数组的对象转换为FormData

Javascript 将具有嵌套数组的对象转换为FormData,javascript,.net,asp.net-mvc,form-data,Javascript,.net,Asp.net Mvc,Form Data,我有这个东西 { "Data1": 1, "Data2": "some string", "Data3": [ { "ID": 0, "Name": "some name", "SomeArray": [] }, { "ID": 0,

我有这个东西

{
  "Data1": 1,
  "Data2": "some string",
  "Data3": [
    {
      "ID": 0,
      "Name": "some name",
      "SomeArray": []
    },
    {
     "ID": 0,
     "Name": "another name",
     "SomeArray": [
       "DataA": 0,
       "DataB": "some data again"
     ]
    }],
  "Data4": "some string again"
}
它将在控制器中接收的模型如下:

public class Data 
{
   public int Data1 { get; set; }
   public string Data2 { get; set; }
   public List<AnotherClass> Data3 { get; set; }
   public string Data4 { get; set; }
}

public class AnotherClass
{
   public int ID { get; set; }
   public string Name { get; set; }
   public List<DataList> SomeArray { get; set; }
}

public class DataList
{
   public int DataA { get; set; }
   public string DataB { get; set; }
}

是否有任何jquery或javascript插件可用于将此对象转换为
FormData
?或者是否有其他方法将其转换为
FormData

您可以以HTML形式发送深度嵌套的数据,但我注意到不同的web服务器可能会以不同的方式解释更复杂的结构,因此您可能需要检查框架/应用程序的中间件以确保正确解码。您可能会发现将值读入Javascript并从Javascript发送数据更容易

您的
Data3
对象可以使用如下方式表示:

<input type="text" name="data[Data3][0][id]" value="0">
<input type="text" name="data[Data3][0][Name]" value="some name">
<input type="text" name="data[Data3][0][SomeArray][]" value="">

您需要一个包含子元素的“父”字段(本例中为数据)

请注意,您必须小心任何
[]
——您可能需要如上所述手动指定数组索引,否则将不考虑值的“分组”

还要注意以
[]
结尾的名称:即使是空字符串,这些字段仍将发送值,因此您可能需要过滤掉这些值。

我找到了这个链接,它可以在其中转换任何对象,包括嵌套数组和将文件上载到
FormData
。然而,只需要做一个改变:

从链接中,替换objectToFormData(obj[property],fd,property)带有
objectToFormData(obj[property],fd,formKey)。这样,它将原始属性设置为键。
FormData
传递给控制器时的输出如下:

Data1: 1
Data2: some string
Data3[0][ID]: 0
Data3[0][Name]: some name
Data3[0][SomeArray]: []
Data3[1][ID]: 0
Data3[1][Name]: another name
Data3[1][SomeArray][0][DataA]: 0
Data3[1][SomeArray][0][DataB]: some data again
Data4: some string again

我希望这能帮助别人

生成此类formdata的表单外观如何?还有,为什么不把它作为JSON发送呢?这就是字符串格式。这只是整个JSON对象的一部分,来自Data3的数据来自一个表。我之所以将此对象转换为FormData,是因为我将在此处添加一个文件上载器控件。
Data3
的故事是,它来自一个表。我所做的是,一旦我从那个表中得到数据,我就把它设置在<代码> DATA3中。如果这是来自数据库表,那么您可能需要考虑使用主键作为数组索引。例如,第123行的
data[Data3][123][Name]
。那么如何满足新的需求呢?此外,新条目的数据条目将来自一个模式弹出窗口(所有这些都是下拉菜单),并填充到表中。然后
SomeArray
正在使用
Select2
插件。因此,我不知道它如何适合我的问题。如果您需要为新记录编写表单,我会保持结构“浅”,例如使用
,并将其发布到专用于创建新资源的API路由,例如
/API/users
——创建新资源时很少需要发布所有旧数据,但如果您有这种需要,也许您可以在问题中详细说明,以帮助我们了解您需要做什么。
Data1: 1
Data2: some string
Data3[0][ID]: 0
Data3[0][Name]: some name
Data3[0][SomeArray]: []
Data3[1][ID]: 0
Data3[1][Name]: another name
Data3[1][SomeArray][0][DataA]: 0
Data3[1][SomeArray][0][DataB]: some data again
Data4: some string again