c# - ViewModel 在 asp.net mvc 5 中回发一个空集合

标签 c# asp.net asp.net-mvc linq

    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 用于生成虚拟数据。我想将项目添加到从下拉列表中选择的列表中。为此,我创建了以下 View :

@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>

Controller

        [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();
        }

添加到列表中的项目应显示在下拉列表下的表格中。但是,当我通过按添加从下拉列表中回发一个选定的项目时,它会向 Controller 返回一个空的 itemlist ,并且以前添加的项目不存在。我怎样才能避免这个问题?

最佳答案

您的 HTML 表单中只有一个输入元素:即下拉列表。因此,提交表单时发送到 Controller 操作的唯一值是 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 表单中的值,那么更好的方法是拥有一个 POST View 模型,它只包含用户可以修改的属性,您将从中检索集合元素您在 GET 操作中检索它们的相同位置。

关于c# - ViewModel 在 asp.net mvc 5 中回发一个空集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29590705/

相关文章:

窗口之间的 C# 数据丢失

asp.net - 在 ASP.NET 中诊断 "Thread was being aborted."

asp.net-mvc - 日期时间格式全局更改

c# - ASP.NET Core MVC(以前的 MVC 6)Razor 错误未被异常过滤器捕获

c# - 如何从对象内部的工作线程检测对象的无效化

c# - 带参数的 .NET 5 路由

asp.net - Web API 路由 - api/{controller}/{action}/{id} "dysfunctions"api/{controller}/{id}

.Net 中的 PHP crypt() 函数?

asp.net-mvc - 在链接按下时更改部分 View

ASP.NET MVC : Using LINQ to XML to render (X)HTML