RaffaySajjad Ответов: 1

Решение для исключения invalidoperationexception


Я учусь ASP.Net ядро MVC. При попытке вызвать функцию через событие нажатия кнопки я получаю эту ошибку:

InvalidOperationException: The model item passed into the ViewDataDictionary is of type 'Book_Store.Models.BookModel', but this ViewDataDictionary instance requires a model item of type 'System.Collections.Generic.IEnumerable`1[Book_Store.Models.BookModel]'.


Я немного запутался, в чем же заключается ошибка. Разве типы данных не одинаковы?

Это моя Книжная модель

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Book_Store.Models
{
    public class BookModel
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public string Author { get; set; }
        public string Description { get; set; }
    }
}


Это и есть контроллер:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Book_Store.Models;
using Book_Store.Repository;
using Microsoft.AspNetCore.Mvc;

namespace Book_Store.Controllers
{
    public class BookController : Controller
    {
        private readonly BookRepository bookRepository = null;
        public BookController()
        {
            bookRepository = new BookRepository();
        }

        public ViewResult GetBookById(int id)  
        {
            var bookDetails = bookRepository.GetBookById(id);
            return View(bookDetails);
        }
        
    }
}


Мой репозиторий, в котором функции определяются вместе с данными, - это:

using Book_Store.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Book_Store.Repository
{
    public class BookRepository
    {
        public List<BookModel> GetAllBooks()
        {
            return DataSource();
        }
        public BookModel GetBookById(int id)
        {
            return DataSource().Where(x => x.Id == id).FirstOrDefault();
        }
        public List<BookModel> SearchBook(string title, string authorName)
        {
            return DataSource().Where(x => x.Title.Contains(title) || x.Author.Contains(authorName)).ToList();
        }
        private List<BookModel> DataSource()
        {
            return new List<BookModel>
            {
                new BookModel(){Id=1, Author="Elif Shafaq", Title="Forty Rules of Love", Description="The pursuit for God"},
                new BookModel(){Id=2, Author="Stephen Hawkings", Title="The Grand Design", Description="Scientific view of the creation of universe"},
                new BookModel(){Id=3, Author="ABC", Title="MVC", Description="Basics of Model View Controller, Design Hierarchy"},
                new BookModel(){Id=4, Author="Author", Title="ASP.Net", Description="Web Development using modern web tools"},
                new BookModel(){Id=5, Author="DEF", Title="Cloud Computing", Description="A dive into new computing field"},
                new BookModel(){Id=6, Author="GHI", Title="Microsoft Azure", Description="Expand you business capabilities by leveraging Microsoft's servers"},
                new BookModel(){Id=7, Author="JKL", Title="Microsoft SQL", Description="Get to know one of the most popular RDBMS"},
                new BookModel(){Id=8, Author="MNO", Title="Xcode", Description="Unlock the capabilities of Apple's ecosystem"},
                new BookModel(){Id=9, Author="PQR", Title="Swift", Description="Make apps for macOS, iOS, tvOS, watchOS"}
            };
        }
    }
}


Что я уже пробовал:

Я попробовал вручную вызвать эту функцию вот так "https://localhost:5001/book/getbookbyid/1", здесь 1-это идентификатор книги, которую нужно получить, но все равно получить ошибку:

An unhandled exception occurred while processing the request.

InvalidOperationException: The model item passed into the ViewDataDictionary is of type 'Book_Store.Models.BookModel', but this ViewDataDictionary instance requires a model item of type 'System.Collections.Generic.IEnumerable`1[Book_Store.Models.BookModel]'.

1 Ответов

Рейтинг:
11

F-ES Sitecore

Ваше представление будет использовать IEnumerable<BookModel> или List<BookModel> или что-то подобное модели, ожидая коллекцию элементов BookModel, но ваш контроллер передает один элемент BookModel в представление.

Вам нужно либо изменить представление, чтобы принять только BookModel в качестве модели, либо изменить контроллер, чтобы вернуть коллекцию элементов BookModel. Какое решение является правильным, зависит от того, что делает точка зрения. Учитывая название действия, я осмелюсь сказать, что это вид, который вы хотите изменить, чтобы запустить один элемент.


RaffaySajjad

Спасибо. Я не обратил внимания на открывающийся вид. Он действительно использует IEnumerable<bookmodel>, Я изменил его на BookModel.