MVC Razor EditorFor 列表中的最后一个对象
MVC Razor EditorFor Last Object in List
我正在尝试为集合中的最后一个子对象显示 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 异常,即使这样做确实有效。
这看起来很简单,我的数据库中有几个地方有这种模式。谁能推荐一个处理这种情况的好方法?
谢谢!
首先,您应该使用 LastOrDefault()
而不是 Last()
,然后进行适当的空值检查。 Last()
引发异常是什么都找不到,而 LastOrDefault
在这种情况下只是 returns null。
其次,使用 Last()
或 LastOrDefault()
不会通过 EditorFor
生成正确的输入名称,所以一旦你 post,modelbinder 将不知道要做什么做价值。相反,您需要使用索引:
@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>
}
您应该为此使用视图模型,因为当您post返回
时,您的 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>
}
我正在尝试为集合中的最后一个子对象显示 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 异常,即使这样做确实有效。
这看起来很简单,我的数据库中有几个地方有这种模式。谁能推荐一个处理这种情况的好方法?
谢谢!
首先,您应该使用 LastOrDefault()
而不是 Last()
,然后进行适当的空值检查。 Last()
引发异常是什么都找不到,而 LastOrDefault
在这种情况下只是 returns null。
其次,使用 Last()
或 LastOrDefault()
不会通过 EditorFor
生成正确的输入名称,所以一旦你 post,modelbinder 将不知道要做什么做价值。相反,您需要使用索引:
@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>
}
您应该为此使用视图模型,因为当您post返回
时,您的 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>
}