Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将深度/长度未知的数组发布到c#/mvc_C#_Asp.net Mvc_Forms_Formcollection - Fatal编程技术网

如何将深度/长度未知的数组发布到c#/mvc

如何将深度/长度未知的数组发布到c#/mvc,c#,asp.net-mvc,forms,formcollection,C#,Asp.net Mvc,Forms,Formcollection,我的背景主要是PHP,因此我习惯于能够非常轻松地在表单中使用深层数组。我需要的是以下的c#/MVC等价物: <input type="text" name="data[0][index_name][0]"> <input type="text" name="data[0][index_name][1]"> <input type="text" name="data[1][index_name][0]"> <input type="text" name="

我的背景主要是PHP,因此我习惯于能够非常轻松地在表单中使用深层数组。我需要的是以下的c#/MVC等价物:

<input type="text" name="data[0][index_name][0]">
<input type="text" name="data[0][index_name][1]">
<input type="text" name="data[1][index_name][0]">
<input type="text" name="data[1][index_name][1]">
<input type="text" name="data[2][index_name][0][something_else]">
<input type="text" name="data[2][index_name][0]">
<input type="text" name="data[2][index_name][1]">
我尝试查看/循环接收到的FormCollection对象,但键只是名称属性字符串,例如“data[2][index_name][0][something_other]”,并且数据没有深度

如何解析这些数据并输入一些可用的数据类型?我不知道数组的深度会有多深,因为表单在前端会动态变化

因此,您有一些上下文,这将用于构建一个数据“表”,该表具有灵活的行数和列数,并且每一行都可以被视为标准行或分组行(意味着它包含其他行),因此理论上,数据可以非常深入

另一方面,我也考虑过清理客户端的数据,但似乎没有任何标准支持这一点。Jquery.serialize和Jquery.serializeArray()执行与C#/MVC相同的操作,只需使用全名属性对所有内容进行索引,而不考虑数组索引


谢谢你的帮助

我不确定深度方面,但如果您发布具有相同名称的项目,则MVC会将其重建为一个数组

<input type="hidden" name="MyArray" value="1"/>
<input type="hidden" name="MyArray" value="2"/>
<input type="hidden" name="MyArray" value="3"/>
<input type="hidden" name="MyArray" value="4"/>
您还可以访问控制器中的
Request.Form
集合。该键来自HTML表单上输入的名称部分

您可以这样访问它:

Request.Form["data[2][index_name][0][something_else]"]
[HttpPost]
public ActionResult MyActionMethod()
{
  foreach(var key in Request.Form.Keys)
  {
    var item = Request.Form[key];
    // Do stuff with each item
  }
}
或者像这样迭代:

Request.Form["data[2][index_name][0][something_else]"]
[HttpPost]
public ActionResult MyActionMethod()
{
  foreach(var key in Request.Form.Keys)
  {
    var item = Request.Form[key];
    // Do stuff with each item
  }
}

模型绑定被证明是正确的解决方案。它支持开箱即用的递归。下面是一篇精彩的评论:

如果你不认为我们这些熟悉c#的人也理解你的PHP代码和引用(如“depth”),你可能会得到更多的回应。我不确定到底该如何澄清。对大多数编程语言来说,访问不同级别数组的方式是相当常见的。我相信你可以考虑一个类似于C语言中的字典的PHP数组。当我提到深度时,我只是指字典的不同级别(例如-var[“level1”][“level2”])。是的,我可以通过这种方式访问数据,但必须使用请求。表单[“data[2][index_name][0][something_其他]]不能帮助我将数据转换为可用格式。我可以解析键字符串并重建数据,但似乎必须有更好/更干净的解决方案。我知道这是一个非常古老的问题,但我认为Scott已经以非常容易理解的方式解释了[link]