2015-06-08 4 views
1

Я пытаюсь создать ViewModel, который будет использоваться с домашней страницей View. ViewModel имеет некоторые свойства, как это:Не удается получить доступ к свойствам ViewModel

public class HomeViewModel 
{ 
    public IEnumerable<NewsItem> NewsItems { get; set; } 
} 

В главном контроллере я создаю экземпляр HomeViewModel и затем установить свойства HomeViewModel перед отправкой его на Начальном Посмотреть, как это:

public ActionResult Index() 
    { 
     HomeViewModel homeVM = new HomeViewModel(); 
     NewsReader newsReader = new NewsReader(); 

     homeVM.NewsItems = newsReader.GetNewsItems(); 

     return View(homeVM); 
    } 

А потом в представлении я пытаюсь сделать это:

@foreach(var item in Model.NewsItems) 
    { 
     @Html.Display(m => m.Title) 
    } 

Однако я получаю:

ViewModels.HomeViewModel does not contain a definition for NewsItems 

Где я ошибаюсь и как его исправить?

enter image description here

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using Site.Services.News; 

using Site.Models; 
using Site.ViewModels; 
using Site.DAL; 
using Site.Services.Products; 

namespace Site.Controllers 
{ 
    public class HomeController : Controller 
    { 
     private DashboardContext db = new DashboardContext(); 

     public ActionResult Index() 
     { 
      HomeViewModel homeVM = new HomeViewModel(); 
      NewsReader newsReader = new NewsReader(); 

      homeVM.NewsItems = newsReader.GetNewsItems(); 

      //NewsReader newsReader = new NewsReader(); 
      //var newsItems = newsReader.GetNewsItems(); 


      return View(homeVM); 
     } 

Heres вид:

@model IEnumerable<Site.ViewModels.HomeViewModel> 
@{ 
    ViewBag.Title = "Home"; 
} 

<div class="jumbotron"> 
    <p class="lead">Overview</p> 
</div> 

<div class="row"> 
    <div class="col-md-4"> 
     <h2>Customers</h2> 
    </div> 
    <div class="col-md-4"> 
     <h2>Sales</h2> 
     <p>@Html.ActionLink("View »", "Index", "SalesRecords", null, new { @class = "btn btn-primary" })</p> 
    </div> 
    <div class="col-md-4"> 
     <h2>News</h2> 

     @foreach(var item in Model.NewsItems) 
     { 
      @Html.Display(item.Title) 
     } 

     <p>@Html.ActionLink("Read »", "Index", "News", null, new { @class = "btn btn-primary" })</p> 
    </div> 
</div> 
+1

Можно что GetNewsitems() возвращает null? Код, который вы опубликовали, выглядит отлично – br4d

+1

Хм, единственное, что я могу придумать, это то, что ваше представление '@ Model' указывает на другой' HomeViewModel', который не имеет свойства 'NewsItems'? –

+0

На самом деле сообщение об ошибке кажется, что 'HomeViewModel' является вложенным классом' ViewModels'? (Если ошибка не показывает пространство имен, но было бы странно начинать с 'ViewModels.').Но класс, который вы создаете экземпляр в контроллере, кажется, не является вложенным классом –

ответ

2

Ошибка, кажется, указывает на то, что представление указывает на другой тип HomeViewModel, который, как я полагаю, не имеет свойства NewsItems.

@Model декларация мнение, по-видимому, указывает на вложенный класс: ViewModels.HomeViewModel

Но HomeViewModel объект, который вы используете в контроллере не является вложенным типом.

UPDATE

В соответствии с вашим обновления, я могу видеть, что ваше мнение действительно указывает на другой тип; IEnumerable<HomeViewModel>, а не HomeViewModel.

+0

HomeViewModel является частью Site.ViewModels – user9993

+0

Можете ли вы опубликовать снимок экрана в верхней части вашего кода просмотра? –

+0

Обновлен вопрос – user9993

0

Изменение:

@foreach(var item in Model.NewsItems) 
{ 
    @Html.Display(m => m.Title) 
} 

Для

@foreach(var item in Model.NewsItems) 
{ 
    @Html.Display(m => item.Title) 
} 
+0

По-прежнему такая же проблема, как и раньше – user9993

+0

Просто используйте @ Html.Display (item.Title) –

+0

или '@ Html.DisplayFor (m => item.Title)' – br4d

1

Ваше мнение

@model IEnumerable<Site.ViewModels.HomeViewModel> 

но контроллер посылает

HomeViewModel homeVM = new HomeViewModel(); 
return View(homeVM); 

т.е. они не имеют такой же тип

попробуйте изменить ваш взгляд на

@model Site.ViewModels.HomeViewModel 
Смежные вопросы