Невозможно отобразить таблицу из SQL в MVC View - PullRequest
0 голосов
/ 02 июля 2018

Это мой репозиторий:

namespace Repositories
{
    public class AuthorRepository : IAuthorRepository
    {
        AppContext myDB = new AppContext();
        public List<Author> GetAllFromRepo()
        {
           return myDB.Authors.ToList();
        }
    }
}

Мой сервисный файл:

namespace Services
{
    public class AuthorService : IAuthorService
    {
        private readonly IAuthorRepository _AuthorRepository;

        public AuthorService(IAuthorRepository authorRepository)
        {
            _AuthorRepository = authorRepository;
        }
        public List<AuthorViewModel> GetAll()
        {
            List<Author> authors = _AuthorRepository.GetAllFromRepo();

            return authors.Select( x => new AuthorViewModel()
            {
                ID = x.ID,
                FullName = $"{x.FirstName } {x.LastName} ",
                Books = x.Books.Select(g => new BookViewModel()
                {
                    ID = g.ID,
                    Name = g.Name
                }).ToList()
            }).ToList();
        }
    }
}

Мой автор Просмотр модели:

    namespace ViewModels
{
    public class AuthorViewModel
    {
        public AuthorViewModel()
        {
            Books = new List<BookViewModel>();  
        }
        public int ID { get; set; }
        public string  FullName { get; set; }

        public List<BookViewModel> Books { get; set; }
    }
}

Книги Смотреть модель:

    namespace ViewModels
{
    public class BookViewModel
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public AuthorViewModel Author { get; set; }    
    }
}

Контроллеры:

 public class HomeController : Controller
 {
    private readonly IAuthorService _AuthorService;
    // GET: Home

    public HomeController(IAuthorService authorService)
    {
        _AuthorService = authorService;
    }

    public ActionResult Index()
    {
        List<AuthorViewModel> Authors = _AuthorService.GetAll();
        ViewBag.myAuthors = Authors;
        return View();

    }

    [HttpGet]
    public ActionResult Books(int id)
    {
        List<AuthorViewModel> Authors = _AuthorService.GetAll();


        ViewBag.Books = from a in Authors
                    where a.ID == id
                    select a.Books;

        return View();
    }
}

Контроллер индекса работает нормально. Но когда я вызываю контроллер Books, он выдает мне эту ошибку в моем браузере:

'System.Collections.Generic.List' не содержит определения для 'ID'

Ошибка источника:

Line 18:     {
Line 19:         <tr>
Line 20:             <td>@book.ID</td>   // this is the error line
Line 21:             <td>@book.Name</td>
Line 22:             <td><a href="~/Home/Index">Home</a></td>

Исходный файл: C: \ Users \ Jack \ Desktop \ WebApp ver 1.2 \ WebApp \ Views \ Home \ Books.cshtml Строка: 20

Модель просмотра для книг:

@{
    ViewBag.Title = "Books";
}

<h2>Books</h2>


<table>
    <tr>
        <th>ID</th>
        <th>Name</th>
        <th>Action</th>

    </tr>

    @foreach (var book in ViewBag.Books)
    {
        <tr>
            <td>@book.ID</td>   
            <td>@book.ID</td>
            <td><a href="~/Home/Index">Home</a></td>

        </tr>
    }
</table>

Здесь, в модели представления индекса, все работает нормально:

@{
    ViewBag.Title = "Index";
}



<h2>Author List</h2>

<table>
    <tr>
        <th>ID</th>
        <th>FullName</th>
        <th>Details</th>
        <th>Books</th>


    </tr>

    @foreach (var author in ViewBag.myAuthors)
    {
    <tr>
        <td>@author.ID</td>
        <td>@author.FullName</td>
        <td><a href="~/Home/Meh/@author.ID">Details</a></td>
        <td><a href="~/Home/Books/@author.ID">Books</a></td>

    </tr>
    }
</table>

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

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Вы сохраняете список авторов как ViewBag.Books. Запрос, который вы используете в действии Books, сохранит список авторов с одним столбцом «Книги» в viewbag, поэтому у вас нет столбца идентификатора в ViewBag.Books. Вы должны изменить запрос, как показано ниже.

ViewBag.Books = (from a in Authors
                    where a.ID == id select a).FirstOrDefault().Books;
0 голосов
/ 02 июля 2018

Ваша главная проблема в том, что вы выбираете a. Книги, т. Е. Список книг

ViewBag.Books = from a in Authors
                    where a.ID == id
                    select a.Books; //Here you select books, so you'll get a list of List<Books>

Вы должны изменить свой cshtml:

@foreach (var books in ViewBag.Books)
{
   @foreach (var book in books ){
    <tr>
        <td>@book.ID</td>   
        <td>@book.ID</td>
        <td><a href="~/Home/Index">Home</a></td>

    </tr>
   }
}

Или измените свой выбор.

В любом случае вам не следует использовать Viewbag в этом сценарии, вы определяете свою модель в представлении и передаете ее с контроллером, как MVC должен действовать следующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...