MVC Razor EditorFor List对象中的最后一个对象
问题描述:
我试图为集合中最后一个子对象显示EditorFor。下面是对波苏斯订单(父)和保持(子集):MVC Razor EditorFor List对象中的最后一个对象
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; }
}
这是我在创建订单视图,显示订单和最后的保持,如果有一个存在的尝试。我已经评论了最后一次不起作用的保留尝试。
@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>
}
货舱收集也可以为空,因此在做最后(),在这种情况下,将区分,即使是做了工作的空例外。
这看起来很简单,我在我的数据库的几个地方有这种模式。任何人都可以推荐一种处理这种情况的好方法吗?
谢谢!
答
您应该使用视图模型,是因为您在发布此回
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);
}
就用不会得到你的HttpPost行动很好的反应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>
}
+0
杰米,我已经知道ViewModels,但从来不知道何时或为什么要使用它们直到现在。谢谢! – Proximo
答
首先,不是使用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>
}
您是否需要'Hold'中的每个字段的编辑器? – JamieD77
不,我只需要一个编辑器的最后一个Hold的DateTime字段集合 – Proximo