2015-07-09 3 views
1

Я пытаюсь отобразить EditorFor для последнего дочернего объекта в коллекции. Ниже приведены Pocos для заказа (Parent) и удержание (сбор ребенка):MVC Razor EditorFor Last Object in 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; } 
} 

Вот моя попытка создания вид заказа, который показывает порядок и последний Оплот, если есть один присутствует. Я прокомментировал последнюю попытку 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> 
} 

трюмы коллекция также может быть пустой так делать Last() в этом случае будет случае, если нулевое исключение, даже если это сделало работу.

Это похоже на что-то простое, и у меня этот шаблон в паре мест в моей базе данных. Может ли кто-нибудь рекомендовать хороший способ справиться с этой ситуацией?

Спасибо!

+1

Вам нужны редакторы для каждого поля в 'Hold'? – JamieD77

+0

Нет Мне просто нужен редактор для поля DateTime последнего Hold в коллекции – Proximo

ответ

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

Джейми, я знал о ViewModels, но не знал, когда и почему использовать их до сих пор. Благодаря! – Proximo

0

Во-первых, вместо использования Last() вы должны использовать LastOrDefault(), а затем выполнить правильную нуль-проверку. Last() вызывает исключение, ничего не найдено, а LastOrDefault просто возвращает null в этом случае.

Во-вторых, с помощью Last() или LastOrDefault() не будет создавать собственные имена входных через EditorFor, поэтому, как только вы разместите, тем 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> 
} 
+0

это не будет действительно отправить назад что-нибудь для 'Holds.When', если' lastIndex = 0' – JamieD77

+0

Спасибо за это .. Я вроде забыл, что вы могли фактически программа в представлении. Я попробовал это, и ему нужно было проверить нуль, и он не оставляет никакого контроля редактора, если Holds пуст. И я не уверен, как отправить сообщение назад. – Proximo