我做了很多研究,只取得了一半的成功。 我的问题是: 我在ASP.NET MVC中有一个View Model的视图,问题是我的一个ViewModel属性是一个下面列出的对象:
public string ApplicationNo { get; set; }
public int HSCode { get; set; }
public IEnumerable<HSCode> HSCodes { get; set; }
public string ItemDescription { get; set; }
public int Weight { get; set; }
public QuantityUnit Quantity { get; set; }
public int Cost { get; set; }
public List<Item> Items { get; set; }
public class Item
{
public int HSCode { get; set; }
public string ItemDescription { get; set; }
public int Quantity { get; set; }
public int Weight { get; set; }
public double Cost { get; set; }
}
我使用局部视图和ajax向用户渲染新项目。 部分观点:
@model ecims.ViewModels.NewApplicationViewModel
<table id="myTableData" class="table" cellpadding="2">
@using (Html.BeginCollectionItem("newRow"))
{
if (Model.Items.Count != 0)
{
<tr>
<th>
@Html.DisplayNameFor(model => @Model.HSCode)
</th>
<td>
@Html.EditorFor(model => @Model.Items.FirstOrDefault().HSCode, new { htmlAttributes = new { @class = "form-control", @value = @Model.Items.FirstOrDefault().HSCode.ToString() } })
</td>
<th>
@Html.DisplayNameFor(model => @Model.Quantity)
</th>
<td>
@Html.EditorFor(model => @Model.Items.FirstOrDefault().Quantity, new { htmlAttributes = new { @class = "form-control", @value = @Model.Items.FirstOrDefault().Quantity.ToString() } })
</td>
<th>
@Html.DisplayNameFor(model => @Model.ItemDescription)
</th>
<td>
@Html.EditorFor(model => @Model.Items.FirstOrDefault().ItemDescription, "Item Description", new { htmlAttributes = new { @class = "form-control", @value = @Model.Items.FirstOrDefault().ItemDescription.ToString() } })
</td>
<th>
@Html.DisplayNameFor(model => @Model.Cost)
</th>
<td>
@Html.EditorFor(model => @Model.Items.FirstOrDefault().Cost, new { htmlAttributes = new { @class = "form-control", @value = @Model.Items.FirstOrDefault().Cost.ToString() } })
</td>
</tr>
}
else
{
<tr>
<th>
@Html.EditorFor(model => @Model.HSCode, new { htmlAttributes = new { @class = "form-control", @value = "" } })
</th>
<td>
@Html.EditorFor(model => @Model.HSCode, new { htmlAttributes = new { @class = "form-control", @value = "" } })
</td>
</tr>
}
}
</table>
我的AJAX功能在这里:
<script type="text/javascript">
$("#add").on('click', function () {
var HSCode = $('#hsCode').val();
var ItemDescription = $('#descrip').val();
var Quantity = $('#qty').val();
var QuantityUnit = $('#qtyUnit').val();
var Cost = $('#cost').val();
$.ajax({
async: false,
data: { 'HSCode': HSCode, 'Quantity': Quantity, 'ItemDescription': ItemDescription, 'QuantityUnit': QuantityUnit, 'Cost': Cost },
url: '/CreateEUCApplication/CreateNewEUCItem',
success: function (partialView) {
$('#newRow').append(partialView);
}
});
});
</script>
我想要&#39;项目&#39;当用户点击“添加”按钮时,ViewModel中的列表将使用新条目进行更新。按钮。目前,我的ajax方法成功地使用新项目更新了视图,但是当我发布到控制器时,&#39; Model.Item&#39; list为空,引发异常。
如何将ViewModel中的列表发布到我的控制器进行处理? 谢谢。 PS:任何改进我的代码的编辑/建议都非常受欢迎(我是新手试图在这方面做得更好:-))
答案 0 :(得分:0)
首先,您不需要在Html帮助程序方法中使用@
;改变:
@Html.DisplayNameFor(model => @Model.HSCode)
到
@Html.DisplayNameFor(model => Model.HSCode)
有一些在线使用BeginCollectionItem的例子:MVC 5 Dynamic Rows with BeginCollectionItem
您不需要使用Html.BeginCollectionItem; on my blog there is another option,这是一个复杂的设置。我的解决方案使用Kendo UI,但这不是必需的。