Я посмотрел this post, и, похоже, глава хочет сделать то же самое, на что я стремлюсь. Я унаследовал это приложение, и хотя я являюсь разработчиком .NET, материал MVC кажется волшебным по сравнению с другими структурами MVC на других языках, которые я предпочитаю. Мой код выступающий выглядят следующим образом:Пытается добавить ICollection в ViewModel в ASP.NET
public class PurchaseOrderViewModel
{
public PurchaseOrderViewModel()
{
this.PurchaseOrder = new PurchaseOrder();
}
// Some other fields here....
public PurchaseOrder PurchaseOrder { get; set; }
public IList<PurchaseOrderItem> OrderItems { get; set; }
}
Контроллер:
[HttpPost]
public ActionResult Details(PurchaseOrderViewModel viewModel)
{
// bunch of stuff. the viewModels.OrderItems here is null.
}
В ТоварыЗаказе в модели является ICollection <> Я преобразование в IList для итеративного характера. Соответствующая часть обзора выглядит следующим образом:
Так почему же я не получаю данные OrderItems? Это связано с тем, что они скорее IList, чем ICollection? Если да, то каково обходное решение?
EDIT: Я изменил код представления, поскольку я что-то оставил, что пытался раньше.
EDIT 2: я принял во внимание текущие комментариев/ответов, так что теперь у меня есть следующие изменения сделаны:
ViewModel:
public ICollection<PurchaseOrderItem> PurchaseOrderItems { get; set; }
PurchaseOrderItem.cshtml: (Я оставил это на самом деле как это в коде на всякий случай):
@model Downland.Model.PurchaseOrderItem
<tr style="background-color: #fff; padding: 8px;">
<td style="text-align: left; width: 210px;">
@if (this.Model.ProductID == null)
{
<img class="viewproduct" src="~/Images/GetThumbnail/-1" alt="Product Image" style="padding: 8px;" />
}
else
{
<img class="viewproduct" src="~/Images/[email protected](this.Model.ProductID)" alt="Product Image" style="padding: 8px;" />
}
</td>
<td>
@(string.IsNullOrEmpty(this.Model.SKU) ? this.Model.NonDownlandSKU : this.Model.SKU)
</td>
<td>@this.Model.ProductName</td>
<td>
@this.Model.Quantity
@Html.EditorFor(m => m.Quantity)
</td>
<td>
@string.Format("{0:C}", this.Model.PriceExVAT)
@Html.EditorFor(m => m.PriceExVAT)
</td>
<td>@string.Format("{0:C}", this.Model.VATTotal)</td>
<td>
@string.Format("{0:C}", this.Model.ItemTotal)
</td>
</tr>
Посмотреть код:
@Html.EditorFor(m => m.PurchaseOrderItems);
Еще один интересный момент. В GET я установил PurchaseOrder, а затем PurchaseOrderItems в модели представления на основе данных базы данных. На почте появляется, что мы снова устанавливаем buyOrder в модели представления с данными из базы данных. Есть несколько других полей, которые корректно задаются в модели представления, основываясь на том, что передается на почту, но PurchaseOrderItems все равно null.
Попробуйте использовать EditorTemplate. Это решит вашу проблему. Взгляните на этот пост http://stackoverflow.com/questions/25365043/mvc-create-object-and-related-objects-in-one-go/25365806#25365806 или http://stackoverflow.com/questions/ 34028606/update-relationship-on-edit-post-with-model-bind-from-mvc-controller/34029526 # 34029526 – Shyju
Я обновил вопрос. Я попробовал EditorTemplate, но безрезультатно @Shyju –