[asp.net-mvc]在 asp.net mvc 5,ViewModel 回发空集合

发布时间: 2017/3/25 1:27:54
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.
    public class SaleItem
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    public class SalesDBContext
    {
        public static List<SaleItem> GetItems()
        {
            var items = new List<SaleItem>(){
                new SaleItem{Id=1,Name="Soap"},
                new SaleItem{Id=2,Name="Milk Power"},
                new SaleItem{Id=3,Name="Toothpaste"},
                new SaleItem{Id=4,Name="Ice Cream"}
            };
            return items.ToList();
        }
    }

    public class SalesViewModel
    {
        public string Item { get; set; }
        public List<SaleItem> itemlist { get; set; }
    }

我有以上 SalesViewModel 类和 SalesDBContext 为虚拟数据生成。我想要将项目添加到列表中,从下拉列表中选择。为此我已创建了以下视图︰

@model MVCDropdown.Models.SalesViewModel
@using MVCDropdown.Models

<form method="post">
    <p>
        @Html.DropDownListFor(model => model.Item, new SelectList(ViewBag.Items, "Id", "Name"), "--select--")
        <input type="submit" value="Add" />
    </p>
    <p>
        @if (Model.itemlist != null)
        {
            <table>
                @foreach (var s in Model.itemlist)
                {
                    <tr>
                        <td>@s.Name</td>
                    </tr>
                }
            </table>
        }
    </p>
</form>

该控制器

        [HttpGet]
        public ActionResult Index()
        {
            SalesViewModel model = new SalesViewModel
            { 
                Item = "",
                itemlist = new List<SaleItem>()
            };
            PopDrodown();
            return View(model);
        }

        [HttpPost]
        public ActionResult Index(SalesViewModel vm)
        {
            var t = SalesDBContext.GetItems().Where(x => x.Id == Convert.ToInt32(vm.Item)).FirstOrDefault();
            vm.itemlist.Add(t);
            PopDrodown();
            return View(vm);
        }

        private void PopDrodown()
        {
            ViewBag.Items = SalesDBContext.GetItems();
        }

添加到列表中的项目应显示在下拉列表中下一个表。 然而,当我发回发从按下拉列表中的选定的项添加,它将返回 null itemlist 到控制器,和以前添加的项不存在。如何避免这一问题?

解决方法 1:

你只有一个单一的输入的元素内部 HTML 表单︰ 这就是下拉列表。所以,当提交表单时发送到您的控制器操作的唯一价值是 Item 属性。如果您想要发送集合可以使用隐藏的字段︰

<table>
    @for (var i = 0; i < Model.itemlist.Count; i++)
    {
        <tr>
            <td>
                @Html.HiddenFor(x => x.itemlist[i].Id)
                @Html.HiddenFor(x => x.itemlist[i].Name)
                @Html.DisplayFor(x => x.itemlist[i].Name)
            </td>
        </tr>
    }
</table>

显然如果用户不是要编辑的值在 HTML 表单中,然后更好的方法是有一个帖子视图模型将包含用户可以修改的属性,您将检索集合元素来自同一个地方你检索它们在获取操作。

官方微信
官方QQ群
31647020