List 使用ASP.NET模型绑定的视图模型中的绑定列表

List 使用ASP.NET模型绑定的视图模型中的绑定列表,list,asp.net-mvc-4,model-binding,List,Asp.net Mvc 4,Model Binding,我正在开发一个应用程序来跟踪通过web应用程序发送的订单。该应用程序不会销售产品,它的设计目的是在订单通过电话进入时跟踪订单 我对ASP.NETMVC还是个新手,所以我还在学习诀窍。我正在尝试使用模型绑定来实现这一点 这是我的视图模型: public class OrderDetailViewModel { public Order Order { get; set; } public List<OrderLine> OrderLinesLis

我正在开发一个应用程序来跟踪通过web应用程序发送的订单。该应用程序不会销售产品,它的设计目的是在订单通过电话进入时跟踪订单

我对ASP.NETMVC还是个新手,所以我还在学习诀窍。我正在尝试使用模型绑定来实现这一点

这是我的视图模型:

public class OrderDetailViewModel
    {
        public Order Order { get; set; }
        public List<OrderLine> OrderLinesList { get; set; }
        public OrderDetailViewModel()
        {
            this.Order = new Order();
            List<OrderLine> OrderLines = new List<OrderLine>();
            OrderLines = new List<OrderLine>();
            OrderLines.Add(new OrderLine());
            this.OrderLinesList = OrderLines;
        }
        public OrderDetailViewModel(Order order)
        {
            this.Order = order;
        }

        public string SalesRepName
        {
            get
            {
                ApplicationDbContext db = new ApplicationDbContext();
                ApplicationUser Rep = db.Users.First(u => u.UserName == Order.SalesRep);
                return Rep.FirstName + " " + Rep.LastName;
            }
        }

        public IEnumerable<SelectListItem> CustomerList
        {
            get
            {
                var Db = new OrderContext();
                var Customers = Db.Customers;
                var AllCustomers = Customers.Select(c => new SelectListItem
                {
                    Value = c.Id.ToString(),
                    Text = c.FirstName + " " + c.LastName
                });

                return AllCustomers;
            }
        }

        public IEnumerable<SelectListItem> ProductList
        {
            get
            {
                var Db = new OrderContext();
                var Products = Db.Products;
                var AllProducts = Products.Select(p => new SelectListItem
                {
                    Value = p.Id.ToString(),
                    Text = p.Name + ", " + p.Airshow + " - " + p.AirshowDate
                });

                return AllProducts;
            }
        }
    }
是的,我知道控制器不处理列表。我使用了数据模型中的属性,然后我了解到需要在视图模型中将列表定义为属性。我正处于改变它的中间,但是当我在创建动作开始时遇到一个中断时,我注意到OrthReNeSLIST是NULL。 另外,我在旧版本的ASP.NET MVC中读到(至少我在参考更新版本的ASP.NET MVC时没有看到),您必须使用for循环而不是foreach循环。我试着走那条路,但仍然有空列表的问题

下面是我在Create视图中尝试作为for循环的代码。这是在当前显示的foreach循环的位置插入的:

@for (int i = 0; i < Model.OrderLines.Count(); i++)
        {
            <tr>
                <td>
                    @Html.DropDownListFor(model => model.OrderLines[i].ProductId, Model.ProductList)
                </td>
                <td>
                    @Html.EditorFor(model => model.OrderLines[i].Quantity)
                </td>
                <td>
                    @Html.EditorFor(model => model.OrderLines[i].TaxRate)
                </td>
                <td>
                    @Html.HiddenFor(model => model.OrderLines[i].Id)
                    @Html.HiddenFor(model => model.OrderLines[i].Price)
                    @Html.HiddenFor(model => model.OrderLines[i].Discount)
                    @Html.HiddenFor(model => model.OrderLines[i].OrderId)
                    @Html.HiddenFor(model => model.OrderLines[i].Order)
                    @Html.HiddenFor(model => model.OrderLines[i].Product)
                </td>
            </tr>
        }
for(int i=0;imodel.OrderLines[i].ProductId,model.ProductList) @Html.EditorFor(model=>model.OrderLines[i].Quantity) @Html.EditorFor(model=>model.OrderLines[i].TaxRate) @Html.HiddenFor(model=>model.OrderLines[i].Id) @Html.HiddenFor(model=>model.OrderLines[i].Price) @Html.HiddenFor(model=>model.OrderLines[i].折扣) @Html.HiddenFor(model=>model.OrderLines[i].OrderId) @Html.HiddenFor(model=>model.OrderLines[i].Order) @Html.HiddenFor(model=>model.OrderLines[i].Product) } 我的最终目标是能够跟踪每个订单的多个行项目,最好是使用模型绑定

我已经通读了很多参考资料,试图让这一点发挥作用,包括:

我遵循了这些建议,但它对我不起作用


如果有人能帮我修一下,我将不胜感激。

你有没有弄明白这一点?我也遇到了同样的问题。
@model AirshowCouponsMvc.Models.OrderDetailViewModel

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>


@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <h4>OrderDetailViewModel</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <table class="table table-striped table-responsive table-hover">
            <tr>
                <th colspan="2">Order Date: @Html.Label(String.Format("{0:MMMM d, yyyy}", DateTime.Now))</th>
                <th colspan="2">Customer: @Html.DropDownListFor(model => model.Order.CustomerId, Model.CustomerList)</th>
            </tr>
            <tr>
                <th>
                    @Html.LabelFor(model => model.Order.OrderLines.FirstOrDefault().Product)
                </th>
                <th>
                    @Html.LabelFor(model => model.Order.OrderLines.FirstOrDefault().Quantity)
                </th>
                <th>
                    @Html.LabelFor(model => model.Order.OrderLines.FirstOrDefault().TaxRate)
                </th>
                <th>
                    @Html.HiddenFor(model => model.OrderLinesList)
                </th>
            </tr>
            @foreach (AirshowCouponsMvc.Models.OrderLine item in Model.OrderLinesList)
            {
                <tr>
                    <td>
                        @Html.DropDownListFor(model => item.ProductId, Model.ProductList)
                    </td>
                    <td>
                        @Html.EditorFor(model => item.Quantity)
                    </td>
                    <td>
                        @Html.EditorFor(model => item.TaxRate)
                    </td>
                    <td>
                        @Html.HiddenFor(model => item.Price)
                        @Html.HiddenFor(model => item.OrderId)
                        @Html.HiddenFor(model => item.Id)
                        @Html.HiddenFor(model => item.Discount)
                        @Html.HiddenFor(model => item.Order)
                        @Html.HiddenFor(model => item.Product)
                    </td>
                </tr>
            }
            <tr>
                <td></td>
                <td>@Html.ActionLink("Add line", "AddLine")</td>
                <td>@if (Model.OrderLinesList.Count > 1) { @Html.ActionLink("Remove line", "RemoveLine") }</td>
            </tr>
        </table>
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10 pull-right">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}
[HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(OrderDetailViewModel model)
        {
            if (ModelState.IsValid)
            {
                OrderContext db = new OrderContext();
                model.Order.OrderDate = DateTime.Now;
                model.Order.SalesRep = User.Identity.Name;
                db.Orders.Add(model.Order);
                foreach (var line in model.Order.OrderLines)
                {
                    line.Price = line.Product.Price;
                    line.Discount = OrderDetailViewModel.DiscountRate(line.Quantity);
                    line.OrderId = model.Order.Id;
                    db.OrderLines.Add(line);
                }
                return RedirectToAction("Index");
            }
            return View(model);
        }
@for (int i = 0; i < Model.OrderLines.Count(); i++)
        {
            <tr>
                <td>
                    @Html.DropDownListFor(model => model.OrderLines[i].ProductId, Model.ProductList)
                </td>
                <td>
                    @Html.EditorFor(model => model.OrderLines[i].Quantity)
                </td>
                <td>
                    @Html.EditorFor(model => model.OrderLines[i].TaxRate)
                </td>
                <td>
                    @Html.HiddenFor(model => model.OrderLines[i].Id)
                    @Html.HiddenFor(model => model.OrderLines[i].Price)
                    @Html.HiddenFor(model => model.OrderLines[i].Discount)
                    @Html.HiddenFor(model => model.OrderLines[i].OrderId)
                    @Html.HiddenFor(model => model.OrderLines[i].Order)
                    @Html.HiddenFor(model => model.OrderLines[i].Product)
                </td>
            </tr>
        }