0

我的背景主要是 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]">

然后可以在 php 中以这种方式访问​​这些...

$_POST['data'][0]['index_name'][0];
$_POST['data'][0]['index_name'][1];
$_POST['data'][1]['index_name'][0];
$_POST['data'][1]['index_name'][1];
$_POST['data'][2]['index_name'][0]['something_else'];
$_POST['data'][2]['index_name'][0];
$_POST['data'][2]['index_name'][1];

我试过查看/循环我收到的 formColletion 对象,但键只是名称属性字符串,例如“data[2][index_name][0][something_else]”,并且没有深度数据。

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

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

附带说明一下,我还考虑过在客户端清理数据,但似乎没有任何标准支持这一点。Jquery.serialize 和 JQuery.serializeArray() 与 C#/MVC 做同样的事情,只是简单地用全名属性索引所有内容,而不考虑数组索引。

谢谢你的帮助!

4

2 回答 2

1

我不确定深层方面,但是如果您发布具有相同名称的项目,则 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"/>

在你的控制器上

[HttpPost]
public ActionResult MyActionMethod(string[] MyArray)
{
  // Do stuff with MyArray
}

您还可以访问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
  }
}
于 2012-09-11T14:01:17.543 回答
0

模型绑定被证明是正确的解决方案。它支持开箱即用的递归。这是一篇不错的文章:http: //msdn.microsoft.com/en-us/magazine/hh781022.aspx

于 2012-09-13T18:13:20.433 回答