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

时间:2012-09-11 13:55:03

标签: c# asp.net-mvc forms formcollection

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

<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做同样的事情,只使用全名属性索引所有内容而不考虑数组索引。

感谢您的帮助!

2 个答案:

答案 0 :(得分: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
  }
}

答案 1 :(得分:0)

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