如何使用Post上的BeginCollectionItem将对象集合发布到控制器?

时间:2017-11-29 13:20:34

标签: c# ajax asp.net-mvc

我做了很多研究,只取得了一半的成功。 我的问题是: 我在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:任何改进我的代码的编辑/建议都非常受欢迎(我是新手试图在这方面做得更好:-))

1 个答案:

答案 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,但这不是必需的。