Я прочитал несколько ответов по этому вопросу, но, несмотря на это, похоже, я разработал слепоту кода.ASP.NET MVC4 IEnumerable empty on post
У меня есть следующий вид модели:
public class IndividualProductVm
{
public virtual Products Products { get; set; }
public ProductSummary ProductSummary { get; set; }
public virtual IEnumerable<ProductSimpleResponse> ProductSimpleResponse { get; set; }
}
Это затем передается в представление, а затем частичный вид:
@model Websites.ViewModels.IndividualProductVm @{ ViewBag.Title = "Edit"; }
<h2>Edit</h2>
@using (Html.BeginForm(null, null, FormMethod.Post, new { name = "form", id = "mainForm" })) { @Html.AntiForgeryToken() @Html.ValidationSummary(true, "", new { @class = "text-danger" }) @Html.HiddenFor(model => model.Products.Id) @Html.HiddenFor(model
=> model.ProductSummary.SupplierId) Html.RenderPartial("_IndividualProduct", Model);
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Save" class="btn btn-default" />
</div>
</div>
}
<div>
@Html.ActionLink("Back to List", "Index", new { id = Model.ProductSummary.SupplierId }, new { @class = "btn btn-default" })
</div>
@section Scripts { @Scripts.Render("~/bundles/jqueryval") }
@model Websites.ViewModels.IndividualProductVm
<div>
@Html.LabelFor(model => model.Products.ProductCode, htmlAttributes: new { @class = "control-label col-md-2" })
<div>
@Html.DisplayFor(model => model.Products.ProductCode, new { htmlAttributes = new { @class = "form-control" } })
</div>
</div>
<div style="clear:both;"></div>
<div>
@Html.LabelFor(model => model.Products.ProductDescription, htmlAttributes: new { @class = "control-label col-md-2" })
<div>
@Html.DisplayFor(model => model.Products.ProductDescription, new { htmlAttributes = new { @class = "form-control" } })
</div>
</div>
<table class="table">
<tr>
<th>
Present
</th>
</tr>
@foreach (var item in Model.ProductSimpleResponse)
{
<tr>
@Html.HiddenFor(modelItem => item.Id)
@Html.HiddenFor(modelItem => item.SupplierId)
@Html.HiddenFor(modelItem => item.ProductCode)
<td>
@Html.EditorFor(modelItem => item.Present)
</td>
</tr>
}
</table>
Однако, когда я вхожу редактировать пост, мой ViewModel является null для IEnumerable<ProductSimpleResponse>
, но отлично подходит для двух других классов.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(IndividualProductVm model)
{
if (ModelState.IsValid)
{
return RedirectToAction("Index", new { id = model.ProductSummary.SupplierId });
}
return View(model.Products);
}
Если кто-то может объяснить, что я делаю неправильно, я был бы очень благодарен.
Вы не можете использовать 'foreach' петлю. Вам нужен цикл 'for' (модель должна быть' IList 'или custom' EditorTemplate' для типа 'ProductSvhcSimpleResponse', см. [Этот ответ] (http://stackoverflow.com/questions/31562284/failing-to-pass -data-from-view-to-the-action-by-html-beginform/31576073 # 31576073) для подробного объяснения –
Просьба ознакомиться со списком заменить на IEnumerable –
Спасибо Стивену. Я был непреклонен, что я пытался реализовать –