0

我有模型类“客户”。它的一个属性是对象的集合,可以说是“订单”。我希望在编辑期间我可以修改与要更新的选定客户关联的订单列表,但是当我提交修改后的客户和修改后的订单时,订单对象为空。请帮助我如何在编辑时发送修改后的订单。这是我的代码

班级

  public class Customer
    {
        public int CustomerId { get; set; }
        public string CustomerName { get; set; }
        public List<Order> Orders { get; set; }
    }

    public class Order
    {
        public int OrderId { get; set; }
        public string OrderName { get; set; }
    }

编辑视图

@model MVCTestApp.Models.Customer
@{
    ViewBag.Title = "Edit";
}

@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Customer</legend>
        @Html.HiddenFor(model => model.CustomerId)
        <div class="editor-label">
            @Html.LabelFor(model => model.CustomerName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.CustomerName)
            @Html.ValidationMessageFor(model => model.CustomerName)
        </div>
        @foreach (var order in Model.Orders)
        {
            <div class="editor-label">
                @Html.Label(order.OrderName)
            </div>
            <div class="editor-field">
                @Html.Editor(order.OrderName, new { id = order.OrderId })
            </div>
        }
        <p><input type="submit" value="Save" /> </p>
    </fieldset>
}

提交的编辑视图

在此处输入图像描述

在此处输入图像描述

4

2 回答 2

1

使用 afor-loop代替foreach

@for (var i=0;i<Model.Orders.Count();i++)
{
    <div class="editor-label">
        @Html.Label(Model.Orders[i].OrderName)
    </div>
    <div class="editor-field">
        @Html.EditorFor(m=> Model.Orders[i].OrderName)
    </div>
}

这个问题的原因可以很容易地在该foreach方法的呈现 html 中看到。元素的名称没有索引,它们都具有相同的名称。模型绑定器无法推断如何将其传递给您的控制器。使用 afor-loop你有点强迫(如果这是正确的术语)标记/html 在你的Orders对象上有一个索引。完成后,模型绑定器现在可以正确地将您的输入映射到该Orders字段。

哦,顺便说一句。现在您正在使用 afor-loop您需要验证您的Orders集合不为空。但我相信你可以轻松做到这一点。

于 2013-04-17T07:31:39.460 回答
0

我建议您像这样获取订单:(检查 order_OrderName 是否是表单中输入字段的名称,例如使用 firebug 或其他内容查看源代码)

public ActionResult Edit(int id, string[] order_OrderName , Customer customer )
{
  //////
}
于 2013-04-17T07:10:05.357 回答