2012-05-24 3 views
0

Я пытаюсь начать изучение MVC. Я создал проект MVC Music Store, который я нашел на сайте Microsoft. http://www.asp.net/mvc/tutorials/mvc-music-store/mvc-music-store-part-1.mvc не может вызвать вид с контроллера

У меня это работает очень хорошо, но я столкнулся с проблемами, когда попытался изменить его. Я хочу поместить данные в отдельный проект. Я использовал Linq для Entities для доступа к данным.

Вот мой класс для доступа к данным

public class clsUtilities 
{ 
    Utilities.MVCMusicStoreEntities db = new Utilities.MVCMusicStoreEntities(); 

    public object GetAlbums(string GenreName) 
    { 
     var query = from tags in db.vieAlbumArtists 
        where tags.GenreName.Equals(GenreName) 
        select tags; 

     return query; 
    } 
} 

В моем контроллере мой код

public ActionResult Browse2(string genre) 
{ 
    // retrieve Genre and its associated albums from the database 

    var genreModel = mcloUtilities.GetAlbums(genre); 

    return View(genreModel); 
} 

сгенерировать файл cshtml на мой взгляд

@model Utilities.vieAlbumArtist 

@{ 
    ViewBag.Title = "Browse2"; 
} 

Это все компилирует нормально, но когда я его запускаю, я получаю:

Элемент моделируемой формы в словаре относится к типу System.Data.Objects.ObjectQuery'1[Utilities.vieAlbumArtist], но для этого словаря требуется тип модели Utilities.vieAlbumArtist.

ответ

0

Это ваша проблема:

public object GetAlbums(string GenreName) 

Вы возвращаете данные в качестве объекта. Но точка зрения ожидает получить элемент типа Utilities.vieAlbumArtist. Либо измените метод GetAlbums(), чтобы вернуть соответствующий тип, либо убедитесь, что вы выбрали его в контроллере для типа, который ожидает вид.

1

Изменить

@model Utilities.vieAlbumArtist

в

@model IEnumerable<Utilities.vieAlbumArtist>

Вы возвращаете список из vieAlbumArtist, а не только один экземпляр.

Вы также можете захотеть изменить

public object GetAlbums(string GenreName)

в

public IEnumerable<Utilities.vieAlbumArtist> GetAlbums(string GenreName)

objects Проходя вокруг не самая лучшая идея.

+0

Вы предполагая, что он хочет коллекцию, когда код не 100 процентов решающим в любом случае. –

+0

Действие GetAlbums, по-видимому, означает, что они не ищут одного элемента. Это правильный ответ на проблему. – anAgent

-1

Чтобы отобразить список альбомов попробовать это:

<ul> 
@foreach(var item in vieAlbumArtist) 
{ 
    <li>item.Name</li> //Not sure if you actually have a name property 
} 
</ul> 
+0

Я думаю, что в жанре будет более 1 альбома ... –

+0

@JakubKonecki, что может быть возможно, но его модель 'Utilities.vieAlbumArtist' специфицирует единственного исполнителя, а не коллекцию. –

+0

Чак - и это проблема. Посмотрите на имена запросов и методов - он получает список альбомов по тегу. –

0

Я был в состоянии решить эту проблему с помощью подсказок вы, ребята, мне дали.

От clsUtilies

public class clsUtilities 
    { 
     Utilities.MVCMusicStoreEntities db = new Utilities.MVCMusicStoreEntities(); 

     public IEnumerable<Utilities.vieAlbumArtist> GetAlbums(string GenreName) 
     { 




     IEnumerable<vieAlbumArtist> query = from tags in db.vieAlbumArtists 
        where tags.GenreName.Equals(GenreName) 

        select tags; 

      foreach (var n in query) 
      { 

      } 

     return query; 

     } 

От контроллера

public ActionResult Browse2(string genre) 
     { 
      // retrieve Genre and its associated albums from the database 


      var genreModel = mcloUtilities.GetAlbums(genre); 


      return View(genreModel); 
     } 

С Просмотры

@model IEnumerable< Utilities.vieAlbumArtist> 


@{ 
    ViewBag.Title = "Browse Albums"; 
} 





@foreach(var album in Model) 
{ 
    <ul> 
     <a href="@Url.Action("Details", new { id=album.AlbumId})"> 
     <img alt="@album.Title" src="@album.AlbumArtUrl" /> 
     <span>@album.Title ( @album.Name) </span> </a> 
     </ul> 
} 











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