MVC Razor编辑器列表中的最后一个对象

时间:2015-07-09 20:34:05

标签: c# asp.net-mvc asp.net-mvc-4 razor editorfor

我试图为集合中的最后一个子对象显示EditorFor。以下是订单(父母)和保留(儿童收藏)的POCO:

public class Order
{
    public int ID {get;set;}
    public string Name {get;set;}
    ....
    public virtual List<Hold> Holds { get; set; }
}

public class Hold
{
    public int ID { get; set; }
    public int OrderID { get; set; }
    public virtual Order Order { get; set; }
    public DateTime? When { get; set; }
    public string Reason { get; set; }
}

这是我尝试创建一个显示订单的订单视图,以及如果存在订单则最后一次保留。我已经评论了最后一次不起作用的Hold尝试。

@model Order

@using (Html.BeginForm("Update", "Order", FormMethod.Post, new {}))
{
   <div class="form-group row">
      @Html.LabelFor(x => x.Name, new { @class = "col-xs-2" })
      <div class="col-xs-10">
         @Html.EditorFor(x => x.Name, new { @class = "form-control"})
      </div>
   </div>

   <div class="form-group row">
      <label class="col-xs-2">When</label>
      <div class="col-xs-10">
         @*@Html.EditorFor(x => x.Holds.Last().When, new {})*@
      </div>
   </div>
}

Holds集合也可以为null,因此在这种情况下执行Last()将会出现null异常,即使它确实有效。

这看起来很简单,我在我的数据库中的几个地方都有这种模式。任何人都可以推荐一种处理这种情况的好方法吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

你应该使用一个视图模型,因为当你发布回来时你的HttpPost动作不会得到很好的响应

public class OrderViewModel
{
    public OrderViewModel()
    {
        Order = new Order();
        Hold = new Hold();
    }
    public Order Order { get; set; }
    public Hold Hold { get; set; }
}

public ActionResult Edit(int id)
{

    var o = from o context.Order.Include("Holds").Single(id);
    var model = new OrderViewModel()
    {
        Order = o
    }
    if (o.Holds.Count() > 0)
        model.Hold = o.Holds.Last();
    return View(model);
}

然后只使用EditorFors

@model OrderViewModel

@using (Html.BeginForm("Update", "Order", FormMethod.Post, new {}))
{
   <div class="form-group row">
      @Html.LabelFor(x => x.Order.Name, new { @class = "col-xs-2" })
      <div class="col-xs-10">
         @Html.EditorFor(x => x.Order.Name, new { @class = "form-control"})
      </div>
   </div>

   <div class="form-group row">
      <label class="col-xs-2>When</label>
      <div class="col-xs-10">
         @Html.EditorFor(x => x.Hold.When)
      </div>
   </div>
}

答案 1 :(得分:0)

首先,您应该使用Last()而不是使用LastOrDefault(),然后进行正确的空值检查。 Last()引发异常是没有找到任何内容,而LastOrDefault在这种情况下只返回null。

其次,使用Last()LastOrDefault()不会通过EditorFor生成正确的输入名称,因此一旦发布,模型绑定器将不知道如何处理该值。相反,您需要使用索引:

@if (Model.Holds.Any())
{
    var lastIndex = Model.Holds.Count() - 1;

    <div class="form-group row">
        <label class="col-xs-2">When</label>
        <div class="col-xs-10">
            @Html.EditorFor(x => x.Holds[lastIndex].When, new {})
        </div>
    </div>
}