2015-07-09 105 views
1

我试图为集合中最后一个子对象显示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> 
} 

货舱收集也可以为空,因此在做最后(),在这种情况下,将区分,即使是做了工作的空例外。

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

谢谢!

+1

您是否需要'Hold'中的每个字段的编辑器? – JamieD77

+0

不,我只需要一个编辑器的最后一个Hold的DateTime字段集合 – Proximo

回答

2

您应该使用视图模型,是因为您在发布此回

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

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

这不会真的发回任何'Holds.When',除非'lastIndex = 0' – JamieD77

+0

感谢你..我有点忘了你可以实际上在视图中编程。我试过这个,它需要一个空检查才能开始,如果Holds为空,它就不会有编辑器控制。我不确定如何回复。 – Proximo