2015-08-04 4 views
0

Я прочитал несколько ответов по этому вопросу, но, несмотря на это, похоже, я разработал слепоту кода.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); 
    } 

Если кто-то может объяснить, что я делаю неправильно, я был бы очень благодарен.

+2

Вы не можете использовать '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) для подробного объяснения –

+0

Просьба ознакомиться со списком заменить на IEnumerable

+0

Спасибо Стивену. Я был непреклонен, что я пытался реализовать –

ответ

-1

использование списка, потому что

IEnumerable подходит только для перебора коллекции, и вы не можете изменить (добавить или удалить) данные IEnumerable принести ВСЕ данные от сервера к клиенту, то фильтровать их, предположим, что у вас есть много записей поэтому IEnumerable накладывает дополнительные накладные расходы на вашу память.

public class IndividualProductVm 
{ 
    public virtual Products Products { get; set; } 
    public ProductSummary ProductSummary { get; set; } 
    public virtual List<ProductSvhcSimpleResponse> ProductSimpleResponse { get; set; } 
} 

More help click here

+0

ерунда. Все, что делает OP, выполняет итерацию коллекции, а не добавление или удаление! И 'List ' is (реализует) ', но не безуспешно.Однако, после обеда, четкой головы и другой попытки, и это заработало. IEnumerable '. Его' Список ', который добавляет дополнительные ovehead! –

+0

@Stephen Muecke - Спасибо за r дайте мне правильный путь, но посмотрите эту ссылку http://www.codeproject.com/Articles/832189/List-vs-IEnumerable-vs-IQueryable-vs-ICollection-v –

+0

Как насчет этой ссылки? Ничто в этом не связано с проблемой OP. Однако вы должны прочитать ссылку, которую я дал в своем комментарии к вопросу, чтобы понять, что такое проблема OP и как ее решить. –

0

Ваше имя свойства ProductSimpleResponse, alhtough тип является ProductSvhcSimpleResponse, так итерацию через него вы должны иметь.

@foreach (var item in Model.ProductSimpleResponse) 

НЕ

@foreach (var item in Model.ProductSvhcSimpleResponse) 
+0

Привет, Бегур. Это был я, будучи копией и вставником идиот. Я отредактирую сообщение соответствующим образом. –