2015-10-09 2 views
0

У меня есть две таблицы, Product & ProductImagesPass IEnumerable ViewModel для просмотра

+---PRODUCT----+ 
| ID   | 
| Name   | 
``````````````` 

+---PRODUCT Images----+ 
| ID     | 
| ProductId   | 
| URL     | 
``````````````````````` 

Я хочу, чтобы отобразить данные в моем Index View из обоих таблиц с помощью ViewModel

Вот мой ViewModel

public class ProductDisplayViewModel{ 
    public int ProductId { get; set; } 
    public string Name {get; set;}   
    public string ImageUrl { get; set; } 

} 

public class ProductIenumViewModel 
{ 
    public IEnumerable<ProductDisplayViewModel> productDisplayViewModel { get; set; } 
} 

Это мой контроллер

public ActionResult Index() 
    { 

     var product = new ProductDisplayViewModel 
     { 
      //ProductId = db.Products.Select(s => s.Id).ToString, 
      Name = db.Products.Select(s => s.Name).ToString(), 
      ImageUrl = db.ProductImages.Select(s => s.URL).ToString() 
     }; 


     var productIenumViewModel = new ProductIenumViewModel 
     { 
      productDisplayViewModel = new List<ProductDisplayViewModel> { product } 
     }; 

     return View(productIenumViewModel); 
    } 

Но я получаю ошибку, что я прошел ViewModel.ProductIenumViewModel, но этот словарь требует модель элемента типа 'System.Collections.Generic.IEnumerable 1[ViewModel.ProductDisplayViewModel]'

, если я использую productDisplayViewModel = IEnumerable<ProductDisplayViewModel> product в моем контроллере я получаю ошибку, что ProductDisplayViewModel является типом, но используется как переменная

Редактировать Это мой взгляд

@model IEnumerable<MyApp.Areas.Admin.ViewModel.ProductDisplayViewModel> 

@{ 
    ViewBag.Title = "Index"; 
} 

<h2>Index</h2> 

<p> 
    @Html.ActionLink("Create New", "Create") 
</p> 
<table class="table table-bordered table-striped" > 
    <tr> 
     <th> 
      @Html.DisplayNameFor(model => model.Name) 
     </th>  
     <th> 
      @Html.DisplayNameFor(model => model.ImageUrl) 
     </th> 
     <th></th> 
    </tr> 

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.Name) 
      @Html.DisplayFor(modelItem => item.ImageUrl) 
     </td> 

     <td> 
      @Html.ActionLink("Edit", "Edit", new { id=item.ProductId }) | 
      @Html.ActionLink("Details", "Details", new { id=item.ProductId }) | 
      @Html.ActionLink("Delete", "Delete", new { id=item.ProductId }) 
     </td> 
    </tr> 
} 

</table> 
+1

Что с вашей точки зрения заявление? – SLaks

+0

Похоже, что модель вашего представления 'IEnumerable ', где она должна быть просто 'ProductIEnumViewModel'. Или, что еще лучше, избавиться от 'ProductIEnumViewModel' и использовать' IEnumerable 'в качестве вашей модели. –

+0

Во-вторых, было бы неплохо увидеть представление. Кроме того, похоже, что вы разделили довольно часть действия контроллера, но теперь код не имеет особого смысла, поскольку вряд ли даже он будет строить ... –

ответ

3

Помимо ошибки, которую вы получаете, вы не правильно формируете свой IEnumerable<ProductDisplayViewModel>.

Ваш контроллер код должен выглядеть следующим образом при условии, что ваша точка зрения имеет @model IEnumerable<ProductDisplayViewModel>

public ActionResult Index() 
{ 

    var products = db.ProductImages 
        .Include("Product") 
        .Select(a => new ProductDisplayViewModel { 
          ProductId = a.ProductID, 
          Name = a.Product.Name, 
          ImageUrl = a.URL 
        }); 
    return View(products); 
} 
+0

Хорошо, спасибо за простой ответ. Теперь я лучше понимаю, можете ли вы объяснить немного, почему вы включили 'Продукты' в' ProductImages', почему нет «Включить« ProductImages »на« Продукт » –

+1

« .Include («Продукты» "), говорит EF о ленивой загрузке коллекции' Products' для 'ProductImages' .. это дает вам доступ к свойствам' Product', таким как 'Id' и' Name'. Поскольку ваш запрос запрашивает от 'db.ProductImages', чтобы начать с того, что у вас уже есть доступ к его свойствам, поэтому нет причин включать' ProductImages'. Вам не нужно '.Include', где инструкции, чтобы вам не понадобилось это в' .Select' для получения свойств продукта. Я просто добавил, что это безопасно – JamieD77

Смежные вопросы