InvalidOperationException при использовании запроса выбора в ASP. NET Core 3.1 MVC - PullRequest
0 голосов
/ 10 июля 2020

Я создаю таблицу, в которой будут отображаться определенные столбцы из моей SQL базы данных. Я получаю сообщение об ошибке

InvalidOperationException: The model item passed into the ViewDataDictionary is of type 'System.Collections.Generic.List, but this ViewDataDictionary instance requires a model item of type 'System.Collections.Generic.IEnumerable

Я попытался запустить необработанный запрос sql (с использованием .FromSqlRaw), но, на мой взгляд, он возвращает нулевое значение модели. Я понимаю ошибку и что установка моего запроса в список и возврат IEnumerable невозможны, но я не нашел успеха в Интернете. Пожалуйста, дайте мне знать, что я могу улучшить. Спасибо!

My View

@model IEnumerable<MyApp.Models.BookModel>
            <table>
                <thead>
                    <tr>
                        <th>
                            @Html.DisplayNameFor(model => model.BookName)
                        </th>
                        <th>
                            @Html.DisplayNameFor(model => model.Author)
                        </th>
                    </tr>
                </thead>
                <tbody>
                    @foreach (var item in Model)
                    {
                        <tr>
                            <td>
                                @Html.DisplayFor(modelItem => item.BookName)
                            </td>
                            <td>
                                @Html.DisplayFor(modelItem => item.Author)
                            </td>
                        </tr>
                    }
                </tbody>
            </table>

My Controller

        [HttpGet("[action]")]
        [Route("/Books/Index")]
        public async Task<IActionResult> Index()
        {
            try
            {
                var data = _context.BookModel
                    .Where(x => x.Id == 10)
                    .Select(x => new { x.BookName, x.Author })
                    .AsNoTracking()
                    .ToListAsync();

                return View(await data);
            }
            catch (Exception)
            {

                throw;
            }
        }

Боковое примечание: установка id = 10 для целей тестирования.

1 Ответ

1 голос
/ 10 июля 2020

Вы можете отправить список MyApp.Models.BookModel, изменив запрос на:

var data = _context.BookModel
    .Where(x => x.Id == 10)
    .Select(x => new BookModel { BookName = x.BookName, Author = x.Author })
    .AsNoTracking()
    .ToListAsync();

OR

var data = _context.BookModel
    .Where(x => x.Id == 10)
    .Select(x => new { x.BookName, x.Author })
    .AsNoTracking()
    .Select(x => new BookModel { BookName = x.BookName, Author = x.Author })
    .ToListAsync();

Надеюсь, вы найдете это полезным.

...