2015-10-19 73 views
0

我有一个表,它的行是用jQuery动态创建的。我可以添加或删除行,以便所有字段都准备就绪时,我只需提交它。 由于行是在任何发布之前创建的,我怎样才能正确地命名它们以便以后轻松地在控制器操作中像Create那样检索它们的值?考虑每一行是“一个对象”,或者每个行至少是一个数组。命名组输入和检索ASP.NET控制器中的值

在ruby中,只需将[]添加到name=属性中即可完成这项工作,不确定ASP.NET是否可行。

这是创建行脚本:

function add_row() { 
    var detalle = $('#detail'); 
    var index = $("#detail tbody").children("tr").length; 
    var newRow = '<tr>' + 
    '<td style="display:none"><input name="Detalle.Index" type="hidden" value="' + index + '" /></td>' + 
    '<td data-title="Quantity">' + 
    '<div class="input-group">' + 
    '<span class="input-group-addon"></span>' + 
    '<input class="form-control" type="number" aria-label="Quantity" name="Detail['+ index +'].quantity" id="Detail_' + index + '__quantity" step="0.001" min="0.000">' + 
    '</div>' + 
    '</td>' + 
    '<td data-title="Price" >' + 
    '<div class="input-group">' + 
    '<span class="input-group-addon">$</span>' + 
    '<input type="number" class="form-control" aria-label="Price" name="Detail['+ index +'].price" id="Detail_' + index + '__price" step="0.001" min="0.000" required="true">' + 
    '</div>' + 
    '</td>' + 
    '<td data-title=""><button type="button" class="btn btn-danger btn-sm" onclick="delete_row(this)">Cancel</button></td>' + 
    '</tr>'; 
    detail.append(newRow); 
} 

在控制器我可以访问Request.Form["Detail[0].price"]来请求得到一个特定的值,但是我不能怎么去总行创建的循环,并得到这样的值:Detail[i].inputname

任何建议将不胜感激。

+2

不要使用'请求'使用MVC的功能。你的POST方法应该包含一个参数'List model',以便集合被'DefaultModelBinder'绑定。参考答案[这里](http://stackoverflow.com/questions/29161481/post-a-form-array-without-successful/29161796#29161796)和[这里](http://stackoverflow.com/questions/ 28019793/submit-same-partial-view-called-multiple-times-data-to-controller/28081308#28081308) –

+0

这是Master-detail场景。那仍然适用? –

+1

绝对如此。并注意在示例中索引器的隐藏输入(在您的情况下它将是''(其中'#'是索引器)它允许你从集合中删除项目,同时注意你当前的实现无法工作,因为如果你添加了一些项目然后删除了一些项目,那么你可能会因为使用'$(“#detail tbody”)而导致重复索引器。儿童( “TR”)长度;' –

回答

2

而不是使用Request.Form[".."]来获取表单值,利用MVC的强大的模型绑定功能,并直接绑定到您的模型。

根据您的脚本,你有一个名为Detail属性,此属性quantityprice复杂对象的集合的主模型的代码,那么你的方法可以

public ActionResult Edit(YourMainModel model) 

和值model.Detail将被正确绑定。

然而,有一个2个错误在你的脚本,这将防止结合模型

首先是隐藏的输入不正确的name属性。它需要

<input name="Detail.Index" type="hidden" value="' + index + '" /> 

name="Detalle.Index"

第二个是你的索引基于表中的行可能导致重复索引的数量。如果您从空表开始并添加3个项目,则最后一个将具有索引值2。如果你删除了第一个,然后再添加另一个,它的索引值也会是2,导致绑定失败。您需要确保索引器是唯一的。实现此目的的一种方式是使用

var index = (new Date()).getTime();