Как исправить Элемент модели, переданный в словарь, имеет ошибку типа?

Я пытаюсь запустить свое первое приложение ASP.NET MVC. Я создал котроллер и просмотр. Данные берутся из базы данных. Однако, когда проект может работать, но когда я пытаюсь перемещаться по странице клиента, я получаю следующую ошибку.

Элемент модели, переданный в словарь, имеет тип 'System.Collections.Generic.List`1 [MvcApplication3.Models.Customer]', но для этого словаря требуется элемент модели типа 'MvcApplication3.Models.Customer'.

Я немного запутался здесь, так как ошибка говорит, что он запрашивает тип модели.

Трассировка стека

Трассировка стека:

[InvalidOperationException: элемент модели, переданный в словарь имеет тип 'System.Collections.Generic.List 1[MvcApplication3.Models.Customer]', but this dictionary requires a model item of type 'MvcApplication3.Models.Customer'.]
System.Web.Mvc.ViewDataDictionary
1.SetModel(значение объекта) +585211
System.Web.Mvc.ViewDataDictionary..ctor(словарь ViewDataDictionary) +371 System.Web.Mvc.ViewPage 1.SetViewData(ViewDataDictionary viewData) +48 System.Web.Mvc.WebFormView.RenderViewPage(ViewContext context, ViewPage page) +73
System.Web.Mvc.WebFormView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) +38
System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) +115
System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) +295 System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) +13
System.Web.Mvc.<>c__DisplayClass1a.<InvokeActionResultWithFilters>b__17() +23 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func
1 продолжение) +242
System.Web.Mvc <. > C_DisplayClass1c.b_19() +21 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList 1 filters, ActionResult actionResult) +177
System.Web.Mvc.Async.<>c__DisplayClass2a.<BeginInvokeAction>b__20() +89 System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult) +102 System.Web.Mvc.Async.WrappedAsyncResult
1.End() +57 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +43
System.Web.Mvc <. > C_DisplayClass1d.b_18 (IAsyncResult asyncResult) +14
System.Web.Mvc.Async <. > C_DisplayClass4.b_3 (IAsyncResult ar) +23 System.Web.Mvc.Async.WrappedAsyncResult 1.End() +62
System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +57 System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23 System.Web.Mvc.Async.WrappedAsyncResult
1.End() +62
System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +47
System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10
System.Web.Mvc <. > C_DisplayClass8.b_3 (IAsyncResult asyncResult) +25
System.Web.Mvc.Async <. > C_DisplayClass4.b_3 (IAsyncResult ar) +23 System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +47 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult результат) +9
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9514812 System.Web.HttpApplication.ExecuteStep(шаг IExecutionStep, Boolean & завершен синхронно) +155

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

namespace MvcApplication3.Controllers
{
    public class CustomerController : Controller
    {
        //
        // GET: /Customer/

        public ActionResult Index()
        {
            Models.NorthwindDataContext nwd = new Models.NorthwindDataContext();
            return View(nwd.Customers.ToList());
        }

    }
}

Вот представление

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MvcApplication3.Models.Customer>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Index
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<h2>Index</h2>

</asp:Content>

<asp:Content ID="Content3" ContentPlaceHolderID="FeaturedContent" runat="server">
</asp:Content>

<asp:Content ID="Content4" ContentPlaceHolderID="ScriptsSection" runat="server">
</asp:Content>

Может кто-нибудь дать мне подсказку, чтобы исправить это?

Ответ 1

Вы пытаетесь передать коллекцию в представление, предназначенное для одного объекта.

измените объявление вида на

Inherits="System.Web.Mvc.ViewPage<IEnumerable<MvcApplication3.Models.Customer>>

Ответ 2

Что именно смущает вас? В вашем файле aspx вы определили модель как клиента, но вместо этого вы передаете ей список.

Ожидаемая модель:

System.Web.Mvc.ViewPage<MvcApplication3.Models.Customer>

Ваши данные:

return View(nwd.Customers.ToList());

Очевидно, что это несоответствие.

Ответ 3

Элемент модели, переданный в словарь, имеет тип

System.Collections.Generic.List1[MvcApplication3.Models.Customer]

но для этого словаря требуется элемент модели типа

MvcApplication3.Models.Customer

Несоответствие типов.

Ответ 4

В вашем связанном представлении (т.е. файле .cshtml) найдите объявление @model: ActionResult должен вернуть правильный экземпляр класса модели, например. если вы определили

@model Customer

то ваш ActionResult должен иметь тип Customer. Вы хотите вернуть список, поэтому вам нужно определить

@model IEnumerable<Customer>

в представлении.

Ответ 5

У меня была эта проблема, и это была проблема модели представления. У меня был этот код в моем проекте MVC:

var config = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<Author, AuthorViewModel>();
        });

        IMapper mapper = config.CreateMapper();
        var dest = mapper.Map<Author, AuthorViewModel>(author);

        return View("Form", dest);

но View Form.cshtml имел неправильную модель:

@model ORMVC.Models.Author

Поэтому я изменил его на:

@model ORMVC.ViewModels.AuthorViewModel