2012-09-11 23 views
0

我的背景主要是PHP,所以我习惯于能够非常容易地在窗体中使用深度数组。我需要的是下面的C#/ MVC equivelant:如何将未知深度/长度的数组发布到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做同样的事情,只需使用全名属性索引所有内容,而不考虑数组索引。

感谢您的帮助!

+1

如果你不认为我们这些知道c#的人能够很好地回答,也可以站在你的PHP代码和引用(如“深度”)下,你可能会得到更多的回应。 。 – RBarryYoung

+0

我不确定如何澄清。您访问数组的不同级别的方式对于大多数编程语言来说相当普遍。我相信你可以考虑一个类似于C#中的Dictionary的PHP数组。当我提到深度时,我只是指不同级别的字典(例如 - var [“level1”] [“level2”])。 –

回答

0

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

+1

我知道这是一个非常古老的问题,但我认为斯科特已经解释了[链接] http://www.hanselman.com/博客/ ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx中很容易理解的方式 –

0

我不确定关于深度方面的问题,但是如果您发布具有相同名称的项目,那么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

是的,我能够以这种方式访问​​数据,但必须使用Request.Form [“data [2] [index_name] [0] [something_else]”]并不能帮助我将数据置于可用格式。我可以解析密钥字符串并重建数据,但似乎必须有更好的/更干净的解决方案 –