[asp.net-mvc]C# visualstudio asp.net 将项添加到列表属性

标签: Asp.net-MVC HTML C#
发布时间: 2017/3/25 10:42:01
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我目前正在开展一个项目,模型 bikestore。 在我 '订单' 的对象,我有自行车项目 lis 对象在订单上。 如何将添加到此列表中的自行车? 我想要显示的小车自行车列表在创建视图中,添加一个或多个他们的顺序,即。

我的控制器︰

        public ActionResult Create()
        {
            return View();
        }


        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "OrderNumber,CustomerName,OrderDate,PickupDate,TotalCost,PaymentMethod")] Order order)
        {
            if (ModelState.IsValid)
            {
                db.Orders.Add(order);
                db.SaveChanges();
                return RedirectToAction("Index");
            }

            return View(order);
        }

我的库存模型

public class Inventory
    {
        public int Id { get; set; }

        public string SerialNumber { get; set; }

        public virtual Store Store { get; set; }
        public int? StoreId { get; set; }

        public string Model { get; set; }

        public string Description { get; set; }

        public Decimal InventoryCost { get; set; }

        public Decimal RecSalePrice { get; set; }

        public Decimal SalePrice { get; set; }

        public string PaymentMethod { get; set; }

        public virtual BikeCategory Category { get; set; }
        public int? CategoryId { get; set; }







    }       

我的订单模型︰

namespace BikeStore.Models
{

    public class Order
    {
        public Order()
        {
            OrderedItems = new List<Inventory>();
        }

        public string CustomerName { get; set; } //FROM CONTROLLER User.Identity.Name

        public virtual List<Inventory> OrderedItems { get; set; }


         [Key, DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]
        public int OrderNumber { get; set; }

在订单的创建视图︰

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

    <div class="form-horizontal">
        <h4>Order</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(model => model.CustomerName, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.CustomerName, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.CustomerName, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.OrderDate, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.OrderDate, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.OrderDate, "", new { @class = "text-danger" })
            </div>
        </div>


        <div class="form-group">
            @Html.LabelFor(model => model.PickupDate, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.PickupDate, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.PickupDate, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.TotalCost, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.TotalCost, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.TotalCost, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            @Html.LabelFor(model => model.PaymentMethod, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.PaymentMethod, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.PaymentMethod, "", new { @class = "text-danger" })
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}

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

解决方法 1:

开始通过创建视图模型来表示你想要在视图中显示/编辑 (酌情添加显示和验证属性)

public class InventoryVM
{
  public int ID { get; set; }
  public string Name { get; set; }
  public bool IsSelected { get; set; }
}
public class OrderVM
{
  public string PaymentMethod { get; set; }
  public List<InventoryVM> Inventory { get; set; }
}

请注意, CustomerNameOrderDateTotal 是不适当的 (你不想要编辑这些用户-他们应该设置在 POST 方法保存该命令之前立即)。不能确定什么 PickupDate 但如果它是实际日期的话,那有不适当的或表示 (这将建立单独收集订单时)。我还建议将 PaymentMethod 是一个枚举或集合的 PaymentType 的那你并使用下拉列表视图中选择。

那么,GET 方法会

public ActionResult Create()
{
  // Get all available bikes, for example
  var inventory = db.Inventory;
  OrderVM model = new OrderVM
  {
    Inventory = inventory.Select(i => new
    {
      ID = i.ID,
      Name = i.Model // modify this to suit what you want to display in the view
    }).ToList()
  };
  return View(model);
}

并在视图中

@model yourAssembly.OrderVM
@using (Html.BeginForm())
{
  for(int i = 0; i < Model.Inventory.Count; i++)
  {
    @Html.HiddenFor(m => m.Inventory[i].ID)
    @Html.CheckBoxFor(m => m.Inventory[i].IsSelected)
    @Html.LabelFor(m => m.Inventory[i].IsSelected, Model.Inventory[i].Name)
  }
  @Html.TextBoxFor(m => m.PayentMethod)
  <input type="submit" value="Create" />
}

POST 方法将

public ActionResult Create(OrderVM model)
{
  // Initialize a new Order and map properties from view model
  var order = new Order
  {
    CustomerName = User.Identity.Name,
    OrderDate = DateTime.Now,
    ....
    PaymentMethod = model.PaymentMethod
  }
  // Save the order so that you now have its `ID`
  IEnumerable<int> selectedItems = model.Inventory.Where(i => i.IsSelected).Select(i => i.ID);
  foreach(var item in selectedItems)
  {
    // You have not shown the model for this so just guessing
    var orderItem = new OrderItem{ OrderID = order.Id, InventoryId = item };
    db.OrderItems.Add(orderItem);
  }
  db.SaveChanges();
}

便笺︰

  1. 如果你想要能够允许用户选择更多,任何项目之一,你就可以改变 bool IsSelectedint Quantity
  2. 如果你想要显示其他信息有关的项目,说 DescriptionCost 你可以包括附加属性在 InventoryVM 查看模型并将它们与显示@Html.DisplayFor(m => m.Inventory[i].Description)
  3. 如果你想要在视图中显示所有选定项目的总成本,你将需要使用 javascript/jquery
  4. 如果 ModelState 可能无效,您将需要重新填充的属性 InventoryVM 你返回视图之前 (如图所示只有 IDIsSelected 属性回发) 或在视图中包括隐藏的输入其他属性
官方微信
官方QQ群
31647020