更新List类型的模型之一在提交时为null

时间:2013-04-17 06:59:48

标签: asp.net-mvc-3 model updatemodel

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

班级

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

已提交已修改的视图

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:1)

使用 for-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上轻松看到此问题的原因。元素的名称没有索引,都具有相同的名称。模型绑定器无法推断如何将其传递给控制器​​。使用for-loop你有点强迫(如果这是正确的术语)标记/ html在Orders个对象上有一个索引。完成此操作后,模型绑定器现在可以正确地将输入映射到Orders字段。

哦顺便说一下。现在您使用的是for-loop,您需要验证您的Orders集合是否为空。但我相信你可以很容易地做到这一点。

答案 1 :(得分:0)

我建议您按照以下方式获取订单:(检查order_OrderName是否是表单中提交的输入的名称,请参阅源代码,例如使用firebug或其他内容)

public ActionResult Edit(int id, string[] order_OrderName , Customer customer )
{
  //////
}